假设我有一个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))
,但这甚至是一个糟糕的破解方法。
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句