R在调用中使用省略号...()

时间:2015-10-22 18:42:51

标签: r

我正在尝试编写一个自定义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函数?谢谢!

1 个答案:

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

mean 2

minicurve(dnorm, mean=.5, sd=5)

mean .5