【发布时间】:2013-08-08 21:46:35
【问题描述】:
我很惊讶missing 似乎无法在lapply 调用的函数中工作。假设我有以下功能:
.add <- function(x, arg, ...) {
if (missing(arg)) {
arg <- 1
}
print(match.call())
return(x + arg)
}
wrapper <- function(l, arg, ...) {
return(lapply(l, .add, arg=arg, ...))
}
设置arg 显式的工作方式类似于例外:
wrapper(list(x=1:10, y=1:10), arg=1)
#FUN(x = X[[1L]], arg = ..1)
#FUN(x = X[[2L]], arg = ..1)
#$x
# [1] 2 3 4 5 6 7 8 9 10 11
#
#$y
# [1] 2 3 4 5 6 7 8 9 10 11
如果没有arg,我希望得到相同的输出,但它失败了:
wrapper(list(x=1:10, y=1:10))
#FUN(x = X[[1L]], arg = ..1)
# Error in FUN(X[[1L]], ...) : argument "arg" is missing, with no default
missing 在不使用lapply 的嵌套包装函数中工作。
为什么它似乎对lapply 调用的函数没有影响?
编辑:默认参数也不起作用:
.add <- function(x, arg=5, ...) {
if (missing(arg)) {
arg <- 1
}
print(match.call())
return(x + arg)
}
wrapper(list(x=1:10, y=1:10))
#FUN(x = X[[1L]], arg = ..1)
# Error in FUN(X[[1L]], ...) : argument "arg" is missing, with no default
看来arg 既不是缺失也不是可访问。这里发生了什么?
(我知道我可以通过在wrapper 中设置arg=NULL 和在.add 中设置if (is.null(arg)) 或其他东西来规避这个问题。.add 是一个内部函数,它根据输入(例如arg=mean(x)),我希望wrapper中的arg为用户记录参数arg并允许用户覆盖默认行为。最重要的是:我想了解为什么这不起作用!)
EDIT2:终于修复了这个行为。这是 R PR#15707。
【问题讨论】:
-
我认为问题出在
wrapper而不是lapply。从wrapper中完全删除形式参数arg(或给它一个默认值),它对我有用。 -
来自文档
?missing:目前missing只能用于定义参数的函数的直接主体,不能用于嵌套函数或本地调用的主体.这在未来可能会改变。 这有帮助吗? -
@joran: 没错,但
.add是一个内部函数,记录的函数是wrapper(arg的可能默认参数取决于输入.add的子集)。 -
@Arun:你是对的,但这有效:
wrapper2 <- function(x, arg) { return(.add(x, arg=arg)) } -
我很想知道为什么会发生这种情况......我已经尝试了很长时间才能理解,但还没有。如果我发现了什么,我会回信。或者也许是时候提供我的第一个赏金了! :)