如何编写具有不同默认值的包装函数而不会导致冲突?

时间:2014-10-18 11:01:54

标签: r arguments argument-passing

假设我编写了jsonlite::fromJSON的包装函数,但为simplifyDataFrame=使用了不同的默认值:

read.json <- function(txt, ...) {
  jsonlite::fromJSON(txt, simplifyDataFrame = FALSE, ...)
}
因此,

read.jsonjsonlite::fromJSON的包装函数,具有不同的默认参数。但是,如果用户指定simplifyDataFrame = TRUE覆盖默认值read.json,则会出现参数名称冲突。

> read.json('{"a":1}')
$a
[1] 1

> read.json('{"a":1}', simplifyDataFrame = TRUE)
Error in jsonlite::fromJSON(txt, simplifyDataFrame = FALSE, ...) : 
  formal argument "simplifyDataFrame" matched by multiple actual arguments

使用不会导致潜在名称冲突的参数的不同默认值来编写包装函数的最佳/正确方法是什么?

1 个答案:

答案 0 :(得分:1)

像@hrbrmstr建议的那样,最简单的方法是:

read.json <- function(txt, simplifyDataFrame = FALSE, ...) {
   jsonlite::fromJSON(txt, simplifyDataFrame = simplifyDataFrame, ...)
}

如果您打算使用大量参数进行操作并希望避免输入太多内容,那么我建议您使用functional包提供的功能:

library(functional)
read.json <- Curry(jsonlite::fromJSON, simplifyDataFrame = FALSE)

Curry的代码如下:

function (FUN, ...) {
    .orig = list(...)
    function(...) do.call(FUN, c(.orig, list(...)))
}

我曾在Curry https://stackoverflow.com/a/15636912/1201032推荐{HID员»,Hadley发表了以下评论,提供了更多选择:

还有plyr::partialptools%<<%%>>%%()%。目前尚不清楚参数的部分评估和惰性评估应如何相互作用,每个软件包采用略有不同的方法。

这是在dplyrmagrittr之前写的;我想也有类似的功能。