eval(call)与将表达式键入控制台不同

时间:2014-09-27 06:17:14

标签: r eval

如果下面有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

1 个答案:

答案 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