如何将表达式列表转换为表达式列表

时间:2014-07-06 07:38:22

标签: r expression eval

假设一个这样的函数:

fun <- function(...) {
  dots <- eval(substitute(alist(...)))
  # ...
}

...应该是一些表达式,应该在函数的其他一些环境中进行评估。例如,fun(name,age)将生成名称对象的ACTUAL列表,如:

[[1]]
name

[[2]]
age

但是,我想评估一个表达式(在某些环境中),如下所示:list(name,age)这是一个EXPRESSION而不是包含用户定义参数的ACTUAL列表。

我该如何进行转型?

2 个答案:

答案 0 :(得分:2)

我不完全清楚您想要评估的位置,但如果您将alist替换为list

fun <- function(..., e) {
  dots <- eval(substitute(list(...)),envir=e)
  dots
}

并设置:

e=new.env() ; e$name="Fred"; e$age=99

然后:

fun(name,age,age*2,e=e)
[[1]]
[1] "Fred"

[[2]]
[1] 99

[[3]]
[1] 198

似乎有资格作为“评估表达式(在某些环境中),如下所示:列表(名称,年龄)”,因为在顶级评估list(name,age)就是这样,对:

> name="Joe"
> age=123
> list(name,age)
[[1]]
[1] "Joe"

[[2]]
[1] 123

答案 1 :(得分:1)

与往常一样,有点不清楚你想要什么,但我认为

fun <- function(...) {
  dots <- eval(substitute(alist(...)))
  as.call(c(list(quote(list)),dots))
}

得到你想要的结果。这里我们采用通过点传入的表达式,并将它们用作调用list()函数的参数。这意味着

ex <- fun(name, age, gender)
ex
# list(name, age)
class(ex)
# [1] "call"

实际上,表达式只是一组调用,因此我假设调用对您有用,但如果您真的想要一个表达式,则可以使用as.expression(ex)