一位同事问我这个,我一直在努力。
假设我想定义一个函数,该函数将表达式(x^2
为具体起见,假设为表达式)作为参数并将该参数传递给curve()
。
如果我想以简单的方式做到这一点,我就跑步
curve(x^2,from=0,to=3)
而且效果很好。
假设我尝试设置一个包装函数(假设除了绘制曲线外,我还想在包装内部做其他事情):
f <- function(g) {
curve(g,from=0,to=3)
}
如果我通过一个函数,这可以工作:
f(function(x) x^2)
如果我尝试通过x^2
,则失败,当R尝试计算表达式时:
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'
物有所值,
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(...)
这sexpr
是substitute(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)
欢迎进一步说明!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句