【发布时间】:2015-02-11 01:43:00
【问题描述】:
让我们考虑以下情况:
foo <- function(param, ...)
{
print(paste("foo:", param))
bar(...)
}
bar <- function(param = NA)
{
print(paste("bar:", param))
}
问题:如何调用foo,让foo得到param = "foo",bar得到param = "bar"?
答案是here,可以使用部分匹配:
foo(param = "foo", par = "bar")
[1] "foo: foo"
[1] "bar: bar"
但是如果不能使用部分匹配怎么办?例如,
- 将
param重命名为p; - 将另一个参数
para_whatever添加到bar; - 添加另一个与
bar签名相同的函数层xyz;
并且该解决方案不再有效。可以做什么(当然不修改源)?
用三个嵌套调用和部分匹配失败来说明最后一个选项,
foo <- function(param, ...)
{
print(paste("foo:", param))
bar(...)
}
bar <- function(param = NA, ...)
{
print(paste("bar:", param))
xyz(...)
}
xyz <- function(param = NA, para_whatever = NA)
{
print(paste("xyz:", param))
}
我正在寻找可以产生的电话
[1] "foo: foo"
[1] "bar: bar"
[1] "xyz: xyz"
所描述的情况实际上发生在install.packages 中的Windows 下,将... 传递给.install.winbinary,调用download.file。这三个都有一个参数quiet。他们的来源可用here 和here。
编辑:为了澄清,我有以下用例。我想打电话给install.packages,它会传递以下参数:
-
quiet = FALSE为install.packages -
quiet = FALSE嵌套调用.install.winbinary -
quiet = TRUE嵌套调用download.file
【问题讨论】:
-
位置匹配(即
..1)是否适合您的用例?像foo(param = "foo", param = "bar")这样的电话是不可能的,也不明智的。 -
我不明白你的问题。
quiet参数从install.packages一直显式传递到download.packages。 -
@nicola 我希望
quiet = TRUE用于链中的第一个和第三个函数,quiet = FALSE用于第二个。这可能没有多大意义,但我问的是一般情况。 -
@Roland 可能。我对任何 R 原生解决方案都很感兴趣,真的。你能详细说明一下吗?
-
如果这是你想要的,你应该重写
install.packages。正如我之前所说,这与...或部分匹配无关,因为quiet是显式传递的。他们不希望您将不同的quiet参数传递给三个函数。
标签: r parameter-passing ellipsis