将表达式作为变量传递给曲线

时间:2015-02-04 20:38:56

标签: r

我正在尝试使用一个存储函数名称的变量作为字符串来绘制曲线。如下所示:

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;。

1 个答案:

答案 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))