矢量化eval(解析(文本))函数

时间:2018-02-28 11:22:04

标签: r vector eval

我在R中遇到了一个带有funciont eval.parent的问题...... 我们来看一个data.table foo,如

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

我想创建一个名为 App_command 的第三列,其中我在 Command 列中获得了该命令的应用结果。

我尝试过这行

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工作? 谢谢!

1 个答案:

答案 0 :(得分:0)

这里有几个问题:

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

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

输出长度为2的向量:

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)