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

Pat*_*cks 6 expression r

假设我有一个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))
Run Code Online (Sandbox Code Playgroud)

但我认为我的get_expr功能是某种黑客攻击.从逻辑上讲,评估不应该是必要的.

有没有更优雅的方式来做到这一点?据我所知,对我来说substitute并不适用,因为我的get_expr函数的参数可能是评估的结果(并且substitute(eval(expr))不进行评估).

我找到了另一种方式parse(text = deparse(val)),但这更糟糕的是黑客...

Bro*_*ieG 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))
Run Code Online (Sandbox Code Playgroud)