我在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工作? 谢谢!
答案 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)