我正在尝试编写一个自定义curve
函数,其中...
将传递给函数而不是图:我希望能够使用say:
curve2(dnorm, mean=2, sd=3)
我遇到了在...
环境中处理call
的问题。从curve
的简化原型开始:
minicurve <- function (expr, from = 0, to = 1, ...)
{
sexpr <- substitute(expr)
expr <- call(as.character(sexpr), as.name("x"))
ll <- list(x = seq(from=from, to=to, length.out=100))
names(ll) <- "x"
y <- eval(expr, envir = ll, enclos = parent.frame())
plot(x = ll$x, y = y, type="l")
}
# This gives the same behaviour as `curve`:
minicurve(dnorm)
现在我想将...
传递给call
(而不是传递给plot
)。通常,这很容易,只需要将...
传递给函数即可。但是,call
函数的行为有所不同,我不知道应该如何处理它。我可以使用:
dot1 <- substitute(...)
expr <- call(as.character(sexpr), as.name(xname), dot1)
这将有效,但它只会传递第一个参数。因此我需要使用像:
dots <- substitute(list(...))
expr <- call(as.character(sexpr), as.name(xname), dots)
但这不起作用:
minicurve2 <- function (expr, from = 0, to = 1, ...)
{
sexpr <- substitute(expr)
dots <- substitute(list(...))
expr <- call(as.character(sexpr), as.name(xname), dots)
ll <- list(x = seq(from=from, to=to, length.out=100))
names(ll) <- "x"
y <- eval(expr, envir = ll, enclos = parent.frame())
plot(x = ll$x, y = y, type="l")
}
那么如何将...
列表传递给call
函数?谢谢!
答案 0 :(得分:2)
这个怎么样
minicurve <- function (expr, from = 0, to = 1, ...) {
sexpr <- substitute(expr)
expr <- call(as.character(sexpr), as.name("x"))
ll <- list(x = seq(from=from, to=to, length.out=100))
names(ll) <- "x"
dots <- substitute(...())
expr <- as.call(c(as.list(expr), dots))
y <- eval(expr, envir = ll, enclos = parent.frame())
plot(x = ll$x, y = y, type="l")
}
在这里,我们通过...
语法将substitute(...())
作为列表捕获。然后我们将调用转换为列表,追加参数,然后将其转回调用。
我们用
进行测试minicurve(dnorm, mean=2, sd=3)
minicurve(dnorm, mean=.5, sd=5)