R 如何判断函数参数是否作为表达式给出,而不进行求值?
下面是一个简单的函数,它将表达式作为参数R 如何判断函数参数是否作为表达式给出,而不进行求值?,r,expression,eval,R,Expression,Eval,下面是一个简单的函数,它将表达式作为参数 f <- function(expr) { expr <- substitute(expr) eval(expr) } 通过直接提供未赋值的参数 f <- function(expr) { expr <- substitute(expr) eval(expr) } 但是,我需要f也像在外部提供显式定义的表达式一样工作,例如 q <- quote(1+1) f(q) q可能有更好的方法,但这里有一种方法:
f <- function(expr) {
expr <- substitute(expr)
eval(expr)
}
通过直接提供未赋值的参数
f <- function(expr) {
expr <- substitute(expr)
eval(expr)
}
但是,我需要f
也像在外部提供显式定义的表达式一样工作,例如
q <- quote(1+1)
f(q)
q可能有更好的方法,但这里有一种方法:
f <- function(expr) {
mess <- suppressWarnings(try(expr, silent = TRUE))
if (inherits(mess, "try-error")) {
expr <- substitute(expr)
}
eval(expr)
}
f(1+1)
## [1] 2
q <- quote(1+1)
f(q)
## [1] 2
f也许你想检查一下是否传给你的是“名字”而不是“电话”
f我喜欢这种更干净的方法+1为什么我们不能这样做:f@tylerlinker该方法肯定会正确计算表达式,我做了额外的步骤,因为OP说他们可能想要修改表达式。通过这种方式,在if语句之后,您应该能够修改将被评估的代码。微小的挑剔:您不应该对类使用==
,因为它可能会返回多个值(而且我认为当对象不是S3时,这会让人困惑)。在这里,您可以使用is.name
,如果您直接提供带引号的对象,则此操作也将失败。基本上,让函数同时进行标准和非标准评估是一个坏主意。
f <- function(expr) {
mess <- suppressWarnings(try(expr, silent = TRUE))
if (inherits(mess, "try-error")) {
expr <- substitute(expr)
}
if (is.character(expr)) return(eval(parse(text=expr)))
eval(expr)
}
f("1 + 1")
## [1] 2
f <- function(expr) {
expr <- substitute(expr)
if(is.name(expr)) {
expr <- eval(expr, parent.frame())
}
eval(expr)
}
f(1+1)
# [1] 2
q<-quote(1+1)
f(q)
# [1] 2