从值获取R表达式(类似于enquote)

时间:2015-03-02 15:40:15

标签: r expression

假设我有一个值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))找到了另一种方法,但这更糟糕了......

2 个答案:

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