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

标签 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)) 找到了另一种方式,但这更像是一个糟糕的黑客......

最佳答案

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

关于r - 从值中获取 R 表达式(类似于 enquote),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813689/

相关文章:

r - 存储没有日期但不作为类字符的时间

javascript - 如何在mapbox GL JS上按日期范围过滤数据?

r - 如何允许函数在表达式()中正常执行?

c++ - C++中的前缀递归表示法

iOS DDMathParser 获取编号 'Blocks'

c# - 使用参数索引器构建表达式树

r - R中的igraph - 找到所有可访问的顶点

r - R 中的 Bigglm : Limitations and Improvements of source code (E. g。调用 Fortran)

r - 查找一行中所有并列的最大值,如果列包含最大值,则返回 true 或 false

用计数 reshape 数据