假设我编写了jsonlite::fromJSON
的包装函数,但为simplifyDataFrame=
使用了不同的默认值:
read.json <- function(txt, ...) {
jsonlite::fromJSON(txt, simplifyDataFrame = FALSE, ...)
}
因此, read.json
是jsonlite::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
使用不会导致潜在名称冲突的参数的不同默认值来编写包装函数的最佳/正确方法是什么?
答案 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::partial
和ptools
,%<<%
,%>>%
和%()%
。目前尚不清楚参数的部分评估和惰性评估应如何相互作用,每个软件包采用略有不同的方法。
这是在dplyr
和magrittr
之前写的;我想也有类似的功能。