如果下面有call
,则
为什么eval(call)
产生的结果不同于简单地将表达式直接输入控制台
x <- list(Vect=seq(3), Mat=matrix(seq(9), ncol=3))
## This call came from the source to `as.data.table.list()`
theCall <- as.call(c(expression(data.frame), x))
theCall
# data.frame(Vect = 1:3, Mat = 1:9)
data.frame(Vect=1:3, Mat=1:9)
# Vect Mat
# 1 1 1
# 2 2 2
# 3 3 3
# 4 1 4
# 5 2 5
# 6 3 6
# 7 1 7
# 8 2 8
# 9 3 9
eval(theCall)
# Vect Mat.1 Mat.2 Mat.3
# 1 1 1 4 7
# 2 2 2 5 8
# 3 3 3 6 9
eval(parse(text=capture.output(theCall)))
# Vect Mat
# 1 1 1
# 2 2 2
# 3 3 3
# 4 1 4
# 5 2 5
# 6 3 6
# 7 1 7
# 8 2 8
# 9 3 9
我甚至尝试在转换为调用的表达式的dput上调用eval,但仍然无法获得与eval(theCall)相同的结果
dput(c(expression(data.frame), x))
# structure(expression(data.frame, Vect = 1:3, Mat = 1:9), .Names = c("", "Vect", "Mat"))
eval(as.call(structure(expression(data.frame, Vect = 1:3, Mat = 1:9), .Names = c("", "Vect", "Mat"))))
# Vect Mat
# 1 1 1
# 2 2 2
# 3 3 3
# 4 1 4
# 5 2 5
# 6 3 6
# 7 1 7
# 8 2 8
# 9 3 9
答案 0 :(得分:5)
在x
中,您将Mat
指定为矩阵。
x <- list(Vect=seq(3), Mat=matrix(seq(9), ncol=3))
theCall <- as.call(c(expression(data.frame), x))
但是,当您查看theCall
的输出时,看起来Mat
是一个数字从1到9的向量。
theCall
# data.frame(Vect = 1:3, Mat = 1:9)
但这并不能说明整个故事。看看通话的结构。
str(theCall)
# language data.frame(Vect = 1:3, Mat = structure(1:9, .Dim = c(3L, 3L)))
您可以看到Mat
实际上表示为矩阵。 theCall
的输出与其内部结构不同。运行str
返回的命令时,可以看到以下数据框。
data.frame(Vect = 1:3, Mat = structure(1:9, .Dim = c(3L, 3L)))
# Vect Mat.1 Mat.2 Mat.3
# 1 1 1 4 7
# 2 2 2 5 8
# 3 3 3 6 9
毫不奇怪,这个结果与eval(theCall)
的结果相同。
eval(theCall)
# Vect Mat.1 Mat.2 Mat.3
# 1 1 1 4 7
# 2 2 2 5 8
# 3 3 3 6 9