【问题标题】:Ellipsis expansion in nested functions: Error "'...' used in an incorrect context"嵌套函数中的省略号扩展:错误“'...' 在不正确的上下文中使用”
【发布时间】:2013-12-13 18:11:00
【问题描述】:

我有一段非常简单的代码:

afun <- function(a) {
  return(bfun(...))
}
bfun <- function(...) {
  return(a + 1)
}

> afun(1)
Error in afun(1) : '...' used in an incorrect context

但是这里 R 不喜欢什么?

【问题讨论】:

  • ... 未在afun 中定义时,afun 如何将... 传递给bfun

标签: r function


【解决方案1】:

在你的函数afun

afun <- function(a) {
  return(bfun(...))
}

... 只是一个参数(没有默认值),就像任何其他参数一样。这并不意味着“自动吸收所有传递给父函数的参数”。就好像您将bfun 定义为:

bfun <- function(b) {
  return(b + 1)
}

然后尝试做:

afun <- function(a) {
  return(bfun(b))
}

为了将a 传递给bfun,您必须自己使用match.call 之类的方式收集该参数,或者您必须对其进行硬编码(例如return(bfun(a))),或者您有使用... 作为afun 的参数(也是唯一的参数)。

通常,... 用于将附加参数传递给后续函数。

【讨论】:

  • 我尝试使用... 作为afun (afun &lt;- function(...) { }) 的唯一参数,但它仍然没有将变量a 传递给bfun。我必须在bfun 中明确包含abfun &lt;- function(a)。所以,我不能这样bfun &lt;- function(...)
  • @Anton 没错。如果您定义了bfun &lt;- function(a) a+1,那么它将起作用。但如果函数的唯一参数是...,那么该函数不会自动解压缩... 中的参数。 ... 被移交给后续函数调用,但那些后续函数必须具有与 ... 中传递的内容相匹配的命名参数
【解决方案2】:

如果您希望 afun 返回具有可变数量参数的函数,只需将 bfun 作为返回值 afun 返回即可。在 R 中,这些被称为 closures

这就是你得到的:

afun <- function(a) {
        print(a)
        function (b, ...){
                print(paste(b, ..., sep = " "))
        } 
}

结果是:

bfun <- afun("in afun body")    # "in afun body from print(a)

bfun("arg1")                    # "arg1" from  print(paste(b, ..., sep = " ")) 
bfun("arg1", "arg2", "arg3")    # "arg1 arg2 arg3" from  print(paste(b, ..., sep = " "))

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2015-02-11
    • 2023-04-03
    • 1970-01-01
    • 2017-03-02
    • 2019-01-28
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多