Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何判断函数参数是否作为表达式给出,而不进行求值?_R_Expression_Eval - Fatal编程技术网

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