2015-12-18 65 views
0

我厭倦了開始我的腳本與require(data.table); require(ggplot2)等等我知道我可以做一些像lapply(c('data.table', 'ggplot2'), require, character.only=T),但它只會返回一個警告(不是錯誤)爲一個丟失的包,再加上我希望我自己的功能require_mult(...)保持腳本清潔。所以我寫的函數:函數加載多個包輸入非字符列表

require_mult <- function(...){ 
    arg_list <- list(...) 
    if(any(!sapply(arg_list, is.character))) stop('require_mult must have character arguments') 
    check <- tryCatch({pkg_array <- unlist(arg_list) 
         loaded <- sapply(pkg_array, require, character.only=TRUE, quietly=TRUE) 
         message('Loaded packages: ', 
           paste(pkg_array, collapse=', ')) }, 
         warning = function(w) stop(w), # I want execution to halt if a package is missing 
         error = function(e) stop(e) 
         ) 
} 

這似乎爲所需的工作(例如,負載爲require_mult('data.table','ggplot2'),錯誤的require_mult('data.table','ggplotfoo')),但我想使這個require_mult(...)工作character.only=FALSE。我看着require的定義,它採用

if (!character.only) 
     package <- as.character(substitute(package)) 

但我無法弄清楚如何在一個未計算表達式,真是一個逗號分隔的列表應用substitute

我知道這個應用程序是非常沒有意義的,學術的,但如果事實上編寫可用於require_mult(data.table, ggplot2)

的解釋require_mult的方式,將豐富我R的表達評價的理解爲什麼不能這樣做也是可以接受的。

+0

你不想在這裏使用'require' - 你可能會發現這篇文章一匯謝有用:http://yihui.name/en/2014/07/library-vs-require/ – TARehman

+0

@ TARehman我明白了 - 但你能想出如何將多個包名稱傳遞給'library'嗎?這是行不通的:'lapply(c('data.table','ggplot2'),library,character.only = T)'如果您可以通過'library'提供一切解決方案,請這樣做。 – C8H10N4O2

+0

我相信你只是想'do.call'。你是否特別需要被傳遞給非字符的包列表?我可以看到爲此寫了一個包裝函數。還是它需要提出一個_error_,而不是_warning_? – TARehman

回答

1

我今天在這裏學到了一些東西!您可以使用match.call來獲取在...中傳遞的參數,而不對它們進行評估。 (大概,你可以用命名參數來做這個...?我需要做更多的實驗。)我使用this answer來構建下面的非常簡單的函數。正如你所看到的,當它到達不存在的包時會中斷。

我想你可以用它來進一步構建。

library_mult <- function(...) { 
    args <- match.call(expand.dots = FALSE)$`...` 
    for(x in args) { 

     x <- as.character(substitute(x)) 
     library(x,character.only = TRUE) 
    } 
} 

> library_mult(MASS,thisisnopack) 

Error in library(x, character.only = TRUE) : 
    there is no package called ‘thisisnopack’ 
+0

這太棒了。我真的認爲你應該將它發佈到[R-devel](https://stat.ethz.ch/mailman/listinfo/r-devel)以包含在未來版本的R中,因爲加載多個庫的默認方式是乏味的。謝謝! – C8H10N4O2