For 循环中断 condformat

For 循环中断 condformat

奇怪的行为:

data(iris)
library(condformat)
#library(knitr)
df <- iris[c(1:5,70:75, 120:125),]

cd <- condformat(df)

cd <- rule_text_bold(cd, 2, df[,2] == apply(df[,2:3], 1, FUN=min))
cd <- rule_text_bold(cd, 3, df[,3] == apply(df[,2:3], 1, FUN=min))

cd

生成正确的输出,其中第 2 行和第 3 行中的最小值以粗体显示。

在此处输入图片描述

但是当我切换到 for 循环时:

data(iris)
library(condformat)
#library(knitr)
df <- iris[c(1:5,70:75, 120:125),]

cd <- condformat(df)

for (j in 2:3){
  cd <- rule_text_bold(cd, j, df[,j] == apply(df[,2:3], 1, FUN=min))
}
cd

它坏了。只有一列突出显示。为什么?我需要对大型表格执行此操作,并且需要循环!

在此处输入图片描述

答案1

也许这个问题更适合放在 stackoverflow 上。

无论如何,condformat 的工作方式是捕获表达式并在需要渲染时对其进行评估,类似于 ggplot2 所做的。这是使用一种称为非标准评估 (NSE) 的技术完成的,利用该rlang包。

您可以在这里阅读有关 NSE 的更多信息:https://dplyr.tidyverse.org/articles/programming.html

rlang 提供了一个名为“bang-bang”的取消引用运算符!!。此运算符允许用户取消引用表达式的某些部分,以用变量的值替换它们。

例如,请参见!!下面的示例中如何使用运算符来替换的值j

data(iris)
library(condformat)
#library(knitr)
df <- iris[c(1:5,70:75, 120:125),]

cd <- condformat(df)

for (j in 2:3){
  cd <- rule_text_bold(cd, !!j, df[,!!j] == apply(df[,2:3], 1, FUN=min))
}
cd

使用 bangbang 操作符后,代码可以按预期运行

在 condformat 0.8.0 上,由于 rlang 包最近更新,您可能会在每个会话中看到一次警告。该警告不会出现在下一个版本中(目前在 GitHub 上)。

相关内容