将表达式传递给函数中的curve()

将表达式传递给函数中的curve(),r,R,一位同事问我这个问题,我一直在苦苦挣扎 假设我想定义一个函数,它将一个表达式(比如说具体的x^2)作为参数,并将该参数传递给curve() 如果我想用简单的方法做这件事,我就跑 curve(x^2,from=0,to=3) 而且效果很好 假设我尝试设置一个包装器函数(假设除了绘制曲线之外,我还想在包装器中执行其他操作): 当R尝试计算表达式时,如果我尝试传递x^2,则失败: f(x^2) ## Error in eval(expr, envir, enclos) (from #2) : obj

一位同事问我这个问题,我一直在苦苦挣扎

假设我想定义一个函数,它将一个表达式(比如说具体的
x^2
)作为参数,并将该参数传递给
curve()

如果我想用简单的方法做这件事,我就跑

curve(x^2,from=0,to=3)
而且效果很好

假设我尝试设置一个包装器函数(假设除了绘制曲线之外,我还想在包装器中执行其他操作):

当R尝试计算表达式时,如果我尝试传递
x^2
,则失败:

f(x^2)
## Error in eval(expr, envir, enclos) (from #2) : object 'x' not found
我可以通过在函数中使用
substitute
来尝试避免这种情况:

f(function(x) x^2)
f0 <- function(g) {
    str(substitute(g))
    curve(substitute(g),from=0,to=3)
}
f0(x^2)
## language x^2
## Error in curve(substitute(g), from = 0, to = 3) (from #3) : 
##  'expr' must be a function, or a call or an expression containing 'x'
如果我尝试调试
curve()
以查看发生了什么,我们有:

sexpr <- substitute(expr)
...
if (!((is.call(sexpr) || is.expression(sexpr)) && xname %in% 
    all.vars(sexpr))) 
    stop(...)

sexpr我本不想先问后答,但我想了一下答案——我突然意识到我还没有尝试过
eval
<代码>求值(曲线(替换(g),从=0到=3))
不起作用,但它可以:

f1 <- function(g) {
     eval(substitute(curve(g,from=0,to=3)))
}
f1(x^2)

欢迎进一步解释

你给我打过电话吗?它似乎可以像使用
lm
glm
一样工作,etcit看起来这个功能只是用来交互工作的(顶级),所以解决方法需要构造与交互编写完全相同的调用,然后进行评估。好吧,至少你没有建议
eval(解析(…)
tho'你险些走近:-)。我同意Richard S.
do.call
在这种情况下是你最好的朋友。
curve(expression(x^2),from=0,to=1)
## Error in curve(expression(x^2), from = 0, to = 1) : 
##   'expr' did not evaluate to an object of length 'n'
sexpr <- substitute(expr)
...
if (!((is.call(sexpr) || is.expression(sexpr)) && xname %in% 
    all.vars(sexpr))) 
    stop(...)
f1 <- function(g) {
     eval(substitute(curve(g,from=0,to=3)))
}
f1(x^2)
f2 <- function(g) {
    do.call(curve,list(substitute(g),from=0,to=3))
}
f2(x^2)