我正在尝试使用一个存储函数名称的变量作为字符串来绘制曲线。如下所示:
f1 <- function(x) 0*x
f2 <- function(x) 1 + 0*x
f3 <- function(x) 2 + 0*x
fn <- "f1"
plot.new()
plot.window(xlim = c(0, 1), ylim = c(-1, 3))
curve(get(fn), add = TRUE)
Error in curve(get(fn), add = TRUE) :
'expr' must be a function, or a call or an expression containing 'x'
curve(f1, add = TRUE)
curve(f2, add = TRUE)
curve(f3, add = TRUE)
我知道我遗漏了curve
如何使用替换处理表达式,或者get
如何传递函数。我特别困惑,因为class(get(fn))
返回&#34;功能&#34;。
答案 0 :(得分:8)
嗯,问题是curve()
不会评估您传入的参数。它会查看您传入参数的内容,而不是评估参数的结果。当你运行
curve(fn)
你传递的是“名字”(或“符号”)。这会触发函数以查找具有该名称的函数。当你运行
curve(get("f1")) #error
你通过了一个电话。同样,曲线不执行该调用以查看它返回一个函数。如错误消息所示,如果您传入一个调用,该表达式应包含x
。例如
curve(f1(x))
是带有x
变量的调用语法的示例。
如果确实需要将函数指定为字符向量,可以将字符转换为名称对象,然后使用do.call构建对曲线的调用。例如
do.call("curve",list(as.name(fn)))
或者您可以修改您的调用以使用特殊x
变量
curve(get(fn)(x))