2015-10-26 168 views
1

我最近開始研究R編程,並且有一個很微不足道的疑問。我想寫一個函數,它會嘗試加載所需的軟件包,並在未安裝時安裝它。tryCatch()Vs if else

我已經用if if邏輯寫了它。我的問題是,如果我使用tryCatch()會更有效率嗎?除了處理錯誤的能力是否還有其他優勢,因爲在這種情況下處理錯誤並不重要。

下面是我目前使用的代碼:

Inst.Pkgs=function(){ 

    if (!require(tm)) 
    {install.packages("tm") 
    require(tm)} 

    if (!require(SnowballC)) 
    {install.packages("SnowballC") 
    require(SnowballC)} 

    if (!require(wordcloud)) 
    {install.packages("wordcloud") 
    require(wordcloud)} 

    if (!require(RWeka)) 
    {install.packages("RWeka") 
    require(RWeka)} 

    if (!require(qdap)) 
    {install.packages("qdap") 
    require(qdap)} 

    if (!require(timeDate)) 
    {install.packages("timeDate") 
    require(timeDate)} 

    if (!require(googleVis)) 
    {install.packages("googleVis") 
    require(googleVis)} 

    if (!require(rCharts)) 
    { 
    if (!require(downloader)) 
    {install.packages("downloader") 
     require(downloader)} 

    download("https://github.com/ramnathv/rCharts/archive/master.tar.gz", "rCharts.tar.gz") 
    install.packages("rCharts.tar.gz", repos = NULL, type = "source") 
    require(rCharts) 
    } 

} 
+0

'tryCatch' * *用於處理錯誤,所以如果您不需要處理錯誤,那麼您不使用此函數... – Tim

+1

您不應該頻繁地重複相同的語句。這很容易出錯,通常被認爲是不好的做法(稱爲DRY原則)。 – RHertel

+0

@RHertel ...我同意......應該使用循環代替。 –

回答

4

您可以一次檢查並安裝缺少的軟件包。

# Definition of function out, the opposite of in 
"%out%" <- function(x, table) match(x, table, nomatch = 0) == 0 

# Storing target packages 
pkgs <- c("tm", "SnowballC", "wordcloud", "RWeka", "qdap", 
      "timeDate", "googleVis") 

# Finding which target packages are already installed using 
# function installed.packages(). Names of packages are stored 
# in the first column 
idx <- pkgs %out% as.vector(installed.packages()[,1]) 

# Installing missing target packages 
install.packages(pkgs[idx]) 
+0

非常感謝......我想我會在編輯時使用它。實際上,install.packages(pkgs [idx])正在安裝所有軟件包,即使它們已經安裝。 –

+0

對不起,但你錯了。它沒有。 –

+0

我不知道,但匹配函數是返回向量的索引as.vector(installed.packages()[,1],這些索引在pkgs中是不可用的,我只是改變了最後一條語句install.packages(pkgs [ ())to install.packages(na.exclude(pkgs [pkgs!= as.vector(installed.packages()[,1] [idx])]))現在好像還在工作,請讓我知道你在想什麼,或者如果我弄錯了所有的東西 –

0

我們其實可以使用tryCatch這個。如果程序試圖加載一個沒有安裝的庫,它會拋出一個錯誤 - 一個可以被tryCatch()調用的函數捕獲並解決的錯誤。

這是我會怎麼做:

needed_libs <- c("tm", "SnowballC", "wordcloud", "RWeka", "qdap", "timeDate", "googleVis") 
install_missing <- function(lib){install.packages(lib,repos="https://cran.r-project.org/", dependencies = TRUE); library(lib, character.only = TRUE)} 
for (lib in needed_libs) tryCatch(library(lib, character.only=TRUE), error = function(e) install_missing(lib)) 

這將安裝缺少的包和負載所需要的庫,如OP請求。

+1

我不會爲此使用'tryCatch',而是來自'install.packages'的錯誤。 – Roland

+0

@Roland'tryCatch'可以處理各種錯誤,包括在嘗試加載未安裝的庫時發生的錯誤。我認爲在這方面使用它沒有任何不利之處。 – RHertel