更改包中所有函数的常用默认参数

时间:2015-06-17 07:22:07

标签: r

我想编写一个函数,将默认值“重置”为包中所有R函数的公共参数。

这可能吗?

我想到的是这个,但这只是返回一系列curried函数:

library(magrittr)

function(parameter){ 
   ls("package:packageName") %>%
   lapply(function(fxnName){
      functional::Curry(get(fxn), paramOfInterest = parameter)
   }
}

%>%包中管道magrittr

我想这样做的一个警告是丢失文档。

也许我可以通过引用一个可修改的属性并存储在包中的对象中来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

虽然可以通过分配到全局环境来实现这一点,但我认为以下内容更为简洁,因为detach环境可以轻松恢复默认行为:

首先是一些演示功能,因为我不知道你想要使用哪个包:

packageDemo <- new.env()
makeFun <- function(x) {x;function(param) c(x, param)}
for (i in paste0("f", letters)) assign(i, makeFun(i), packageDemo)

现在我的咖喱包功能。它将环境或包名称作为字符向量(例如"package:myPackage")。环境中的所有功能都是curry并添加到返回的新环境中。如果需要,可以attach

curryPackage <- function(package, ..., functionNames = NULL){
  if (is.character(package) && !grepl("^package:", package)) {
    package <- paste0("package:", package)
  }
  fnNames <- ls(package)
  if (!is.null(functionNames)) {
    fnNames <- fnNames[fnNames %in% functionNames]
  }
  fnNames <- fnNames[vapply(fnNames, function(x) is.function(get(x, package)), logical(1))]
  fnList <- lapply(fnNames, function(x){
    functional::Curry(get(x, package), ...)
  })
  names(fnList) <- fnNames
  list2env(fnList)
}

现在进行一些演示

attach(packageDemo)
fc("Testing")
#[1] "fc"   "Testing"
fc()
#Error in fc() : argument "param" is missing, with no default

newPack <- curryPackage(packageDemo, param = "demo")
attach(newPack)
#The following objects are masked from packageDemo:
#
#    fa, fb, fc, fd, fe, ff, fg, fh, fi, fj, fk, fl, fm, fn, fo, fp, fq, fr, fs, ft, fu, fv, fw, fx, fy, fz
fc("Testing")
#Error in (function (param)  : unused argument ("Testing")
fc()
#[1] "fc"   "demo"