在R核心包函数中重新定义参数

问题描述

我的手指开始厌倦键入update.packages(checkBuilt = T,ask = F)。我想知道是否有可能在update.packages()函数中重新定义认参数。到目前为止,我已经尝试将以下内容添加到我的 .Rprofile 文件中:

utils::assignInNamespace(
  "update.packages",function(checkBuilt = TRUE,ask = FALSE,...) {

    update.packages(checkBuilt = checkBuilt,ask = ask,...)

  },"utils"
)

但是当我尝试在R中使用该函数时,出现以下错误

update.packages()
Error: C stack usage  7976404 is too close to the limit

我还尝试在 .Rprofile 中将formals()与以下内容配合使用:

local({

  args_new <- alist(lib.loc = .libPaths(),checkBuilt = TRUE)
  ind <- which(methods::formalArgs(update.packages) %in% names(args_new))

  formals(update.packages)[ind] <- args_new
  
})

但是启动R时会导致以下错误

Error in formals(update.packages) : object 'update.packages' not found

解决方法

正如@Roland在评论中所说,您的定义是递归的。您不必理会assignInNamespace:将新功能保留在工作区中就足够了。然后,您可以在其定义中使用utils::update.packages,例如

update.packages <- function(checkBuilt = TRUE,ask = FALSE,...) 
  utils::update.packages(checkBuilt = checkBuilt,ask = ask,...)

出于帮助页面上列出的原因,您应避免使用assignInNamespace