假设我有一个值x
,它是某种(未知)类型(特别是:标量,向量或列表)。我想得到代表这个值的R表达式。如果x == 1
那么此函数应该只返回expression(1)
。对于x == c(1,2))
,此函数应返回expression(c(1,2))
。 enquote
函数非常接近我想要的,但不完全正确。
通过一些游戏,我找到了以下问题的“解决方案”:
get_expr <- function(val) {
tmp_expr <- enquote(val)
tmp_expr[1] <- quote(expression())
return(eval(tmp_expr))
}
get_expr(1) # returns expression(1)
get_expr(c(1, 2)) # returns expression(c(1, 2))
get_expr(list(x = 1)) # returns expression(list(x = 1))
但我认为我的get_expr
功能是某种黑客攻击。从逻辑上讲,评估不是必要的。
有更优雅的方法吗?据我所知,substitute
对我来说并不适用,因为我的get_expr
函数的参数可能是评估的结果(并且substitute(eval(expr))
没有进行评估)。
我通过parse(text = deparse(val))
找到了另一种方法,但这更糟糕了......
答案 0 :(得分:6)
as.expression(list(...))
似乎这样做了:
> get_expr <- function(val) as.expression(list(val))
> str(get_expr(1))
expression(1)
> str(get_expr(c(1, 2)))
expression(c(1, 2))
> str(get_expr(list(x=1)))
expression(list(x = 1))
> val <- list(x=1, y=2)
> str(get_expr(val))
expression(list(x = 1, y = 2))
答案 1 :(得分:2)
你可以使用substitute()
,只需要稍微改变一下:
express <- function(e) substitute(expression(x), env = list(x=e))
v1 <- c(1, 2)
express(v1)
# expression(c(1, 2))
v2 <- list(a = 1, b = 2)
express(v2)
# expression(list(a = 1, b = 2))