【问题标题】:Identically named parameters for nested function calls and ellipsis嵌套函数调用和省略号的同名参数
【发布时间】: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。他们的来源可用herehere

编辑:为了澄清,我有以下用例。我想打电话给install.packages,它会传递以下参数:

  1. quiet = FALSEinstall.packages
  2. quiet = FALSE 嵌套调用 .install.winbinary
  3. 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


【解决方案1】:

我不太明白这个问题,但是既然你问了一个位置匹配的例子:

foo <- function(param, ...)
{
  print(paste("foo:", param))
  bar(..1)
}

bar <- function(param = NA) 
{
  print(paste("bar:", param))
}

foo(param = "foo", "bar", "baz")
#[1] "foo: foo"
#[1] "bar: bar"

编辑:如果一个参数通过省略号传递给两个不同的函数,则不能将不同的参数值传递给这些函数。您需要更改调用函数(例如,您可以使用trace)。

【讨论】:

  • 谢谢,但不幸的是触及了源头。如果我可以修改源,我会通过重命名参数名称来避免这种冲突。
  • 如果不更改install.packages,您将无法实现您在编辑中概述的内容。
  • 我怕会这样。好的,这确实回答了我的问题,所以如果您想将该注释合并到答案本身中,我很乐意接受。
猜你喜欢
  • 2019-01-28
  • 2017-03-02
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多