假设一个这样的函数:
fun <- function(...) {
dots <- eval(substitute(alist(...)))
# ...
}
...
应该是一些表达式,应该在函数的其他一些环境中进行评估。例如,fun(name,age)将生成名称对象的ACTUAL列表,如:
[[1]]
name
[[2]]
age
但是,我想评估一个表达式(在某些环境中),如下所示:list(name,age)
这是一个EXPRESSION而不是包含用户定义参数的ACTUAL列表。
我该如何进行转型?
答案 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)
。