r - 将表达式传递给函数内的 curve()

标签 r

一位同事问我这个问题,我一直在努力解决这个问题。

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

如果我想以简单的方式做到这一点,我只需运行

curve(x^2,from=0,to=3)

而且效果很好。

假设我尝试设置一个包装器函数(假设除了绘制曲线之外我还想在包装器内部做其他事情):

f <- function(g) {
    curve(g,from=0,to=3)
}

如果我传递一个函数,这就会起作用:

f(function(x) x^2)

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

f(x^2)
## Error in eval(expr, envir, enclos) (from #2) : object 'x' not found

我可以尝试通过在函数中使用 substitute 来阻止这种情况:

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'

好吧,这表明也许我应该尝试

f <- function(g) {
    h <- as.expression(substitute(g))
    str(h)
    curve(as.expression(substitute(g)),from=0,to=3)
}
f(x^2)
##  expression(x^2)
## Error in curve(as.expression(substitute(g)), from = 0, to = 3) (from #4) : 
##  'expr' must be a function, or a call or an expression containing 'x'

就其值(value)而言,

  • 此失败与 curve(h,...) 不同(“找不到函数 h”)
  • 如果将 as.call() 替换为 as.expression()
  • ,也会以同样的方式失败
  • curve() 在任何情况下都不适用于表达式:

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'

如果我尝试调试curve()来看看发生了什么,我们会得到:

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

此处 sexprsubstitute(g),它未通过 xname %in% all.vars(sexpr) 测试 ...

关于如何处理这个问题有什么想法吗?

最佳答案

我并不是想先问然后回答,但我通过更多的探索找到了(一个?)答案——我突然想到我没有尝试过 eval还没有。 eval(curve(substitute(g),from=0,to=3)) 确实不起作用,但是这样可以:

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

更新:@RichardScriven 建议 do.call() 也可能有效——而且确实如此!

f2 <- function(g) {
    do.call(curve,list(substitute(g),from=0,to=3))
}
f2(x^2)

欢迎进一步说明!

关于r - 将表达式传递给函数内的 curve(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27713983/

相关文章:

r - 如何找到曲线的线性部分

R:如何更改点阵(levelplot)颜色主题?

r - 如何在同一列内制作箱线图来表示土柱

r - 将多行数据合并成一列

r - 正确配置 PI ODBC 客户端以便可以使用 RODBC

html - 尝试将 .rmd 文件上传到 wordpress

r - 如何根据下标在矩阵中逐元素赋值?

r - 因子到因子的条件重新编码

r - 在 R 上运行 CellNet 时未加载 dyld

MySQl 和 R : Error connecting Database