向量化 eval(parse(text)) 函数

vectorising the eval(parse(text)) function

我在 R 中遇到函数 eval.parent 的问题... 让我们以 data.table foo 为例

Value  Command
NA     "is.na(foo$Value)"
NA     "foo$Value>1"

我想创建一个名为 App_command 的第三列,其中我在列 Command[ 中有应用命令的结果=34=].

我试过这条线

foo<-foo[,App_command:=eval.parent(parse(text=foo$Command))]

但输出是

Value  Command               App_command
NA     "is.na(foo$Value)"    NA
NA     "foo$Value>1"         NA

我也试过切换两行,即将命令应用到 de table

Value  Command            
NA     "foo$Value>1"       
NA     "is.na(foo$Value)"  

结果是

Value  Command              App_command
NA     "foo$Value>1"        TRUE 
NA     "is.na(foo$Value)"   TRUE 

解析函数的输出是

expression(foo$Value>1,is.na(foo$Value))

所以我认为 eval.parent 函数应用于具有多个参数的表达式时,只计算最后一个参数。有没有什么方法可以在不使用 for 循环的情况下通过 sapply 和 co. 使 eval.parent 工作? 谢谢!

这里有几个问题:

首先foo$Value是一个长度为2的向量:

eval.parent(parse(text="is.na(foo$Value)"))

输出一个长度为二的向量:

TRUE TRUE

另一个例子:

a <- c(1, NA)
eval.parent(parse(text="is.na(a)"))
#FALSE TRUE

现在您想矢量化 eval.parent,这可以通过以下方式完成:

eval_vec = Vectorize(eval.parent, vectorize.args = "expr")

eval_vec(parse(text = foo$Command))
#    [,1] [,2]
[1,] TRUE   NA
[2,] TRUE   NA

第一列包含对 "is.na(foo$Value)" 的评估,第二列包含对 "foo$Value>1"

的评估

这个矩阵的对角线就是我认为你正在寻找的(对第一个元素的第一个表达式的求值等等):

diag(eval_vec(parse(text = foo$Command)))

library(data.table)
foo[,App_command:=diag(eval_vec(parse(text=foo$Command)))]
foo
   Value          Command App_command
1:    NA is.na(foo$Value)        TRUE
2:    NA      foo$Value>1          NA

数据:

foo <- read.table(text = "Value  Command
NA     is.na(foo$Value)
NA     foo$Value>1", header = TRUE)

foo$Command <- as.character(foo$Command)

library(data.table)

foo <- as.data.table(foo)