从值中获取 R 表达式(类似于 enquote)
Getting an R expression from a value (similar to enquote)
假设我有一个值 x
是某种(未知)类型(尤其是:标量、向量或列表)。我想得到代表这个值的 R 表达式。如果 x == 1
那么这个函数应该简单地 return expression(1)
。对于 x == c(1,2))
,此函数应 return expression(c(1,2))
。 enquote
函数非常接近我想要的,但不完全是。
通过一些尝试,我发现以下 "solution" 我的问题:
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
函数是某种 hack。从逻辑上讲,评估应该是没有必要的。
有没有更优雅的方法来做到这一点?据我所知,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))
您可以使用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))
假设我有一个值 x
是某种(未知)类型(尤其是:标量、向量或列表)。我想得到代表这个值的 R 表达式。如果 x == 1
那么这个函数应该简单地 return expression(1)
。对于 x == c(1,2))
,此函数应 return expression(c(1,2))
。 enquote
函数非常接近我想要的,但不完全是。
通过一些尝试,我发现以下 "solution" 我的问题:
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
函数是某种 hack。从逻辑上讲,评估应该是没有必要的。
有没有更优雅的方法来做到这一点?据我所知,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))
您可以使用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))