2015-04-20 60 views
1

我试图从包installr中配置updateR()以使用我公司的内部CRAN为最终用户提供更容易的升级。 updateR()利用另一个函数check.for.updates.R()来确定是否存在更新的版本。 check.for.updates.R()有一个参数,我想设置为"http://internal/cran/bin/windows/base/"。我使用formals(check.for.updates.R)$page_with_download_url = "http://lnxaws01/cran/bin/windows/base/"尝试设置默认参数。R - 更改嵌套函数调用的默认参数

formals(check.for.updates.R) 
#>$notify_user 
#>[1] TRUE 
#> 
#>$use_GUI 
#>[1] TRUE 
#> 
#>$page_with_download_url 
#>[1] "http://internal/cran/bin/windows/base/" 
#> 
#>$pat 
#>[1] "R-[0-9.]+-win" 

所以,这似乎工作。检查它的实际工作:

check.for.updates.R(use.GUI=F) 
#>No need to update. You are using the latest R version: 
R version 3.1.3 (2015-03-09)[1] FALSE 

注 - 在此发布的时候,R 3.2.0刚刚发布,我们的内部CRAN仍在运行3.1.3所以这是正确的响应。

但是,updateR()继续检查RStudio CRAN,并最终认为有一个新的包可用。

从CRAN中删除Defaults包(也许它不会有任何帮助)我如何更改嵌套在另一个函数中的函数的默认参数值?

回答

2

这不起作用,因为当你“修改”check.for.updates.R时,你并没有真的修改它。相反,您正在创建一个分配给掩盖原始副本的全局环境的副本。所以如果你运行这个函数,它会看起来像是在做你期望的。但是,如果您运行的是updateR,它将会改为在其命名空间环境中查找,这是原函数不变的原因。

由于updateR不公开所需check.for.updates.R参数,可以改为tracecheck.for.updates.R

trace(
    installr::check.for.updates.R, 
    quote(page_with_download_url <- "http://internal/cran/bin/windows/base/") 
) 

这将使该行的第一行代码运行在check.for.updates.R。请注意,我们完全凌驾于论据之上,不仅仅是改变默认值,而且看起来这对你很有用。

+0

这真是太棒了,谢谢。 – Mark