向量化 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)
我在 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)