2015-04-20 107 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