2016-07-06 11 views
0

tryCatch()を使用して、ループ内からパッケージがインストールされているかどうかを確認してから、nextを返して次の繰り返しにスキップしますパッケージがロードまたはインストールに失敗した場合は、ループの同時に、これを報告するメッセージをコンソールに戻したいと思います。私はどちらか一方をすることができますが、同時に両方を行う方法を理解することに問題があります。たとえば、次のようになります。「next」を返し、tryCatch関数から次のループの繰り返しにスキップするメッセージを表示します

package_list<-c("ggplot2", "grid", "plyr") 

for(p in package_list){ 

    # check if package can't be loaded 
    if(!require(p,character.only=TRUE,quietly=TRUE,warn.conflicts=FALSE)){ 

    write(paste0("Attempting to install package: ",p), stderr()) 

    # try to install & load the packages, give a message upon failure 
    tryCatch(install.packages(p,repos="http://cran.rstudio.com/"), 
      warning = function(e){write(paste0("Failed to install pacakge: ", p), stderr())}, 
      error = function(e){write(paste0("Failed to install pacakge: ", p), stderr())}) 
    tryCatch(library(p,character.only=TRUE,verbose=FALSE), 
      warning = function(e){write(paste0("Failed to install pacakge: ", p), stderr())}, 
      error = function(e){write(paste0("Failed to install pacakge: ", p), stderr())}) 

    # try to install & load the packages, skip to next loop iteration upon failure 
    tryCatch(install.packages(p,repos="http://cran.rstudio.com/"),warning = next) 
    tryCatch(library(p,character.only=TRUE,verbose=FALSE),warning = next) 
    } 
} 

しかし、これは各コマンドを2回実行する必要があります。一度失敗すれば失敗のメッセージを返し、もう一度失敗してループの次の項目にスキップします。

代わりに、私はむしろ、このように、単一の関数で両方のアクションを実行します:あなたが関数内からnextを使用することはできませんので

for(p in package_list){ 
    if(!require(p,character.only=TRUE,quietly=TRUE,warn.conflicts=FALSE)){ 
    tryCatch(install.packages(p,repos="http://cran.rstudio.com/"), 
      warning = function(e){print(paste("Install failed for package: ", p)); return(next)}) 
    # ... 
    } 
} 

しかし、これは失敗します。

Error in value[[3L]](cond) : no loop for break/next, jumping to top level 

はですこの機能を実行するには、tryCatch()からnextコマンドを発行して、目的のメッセージを返す方法がありますか?

答えて

1

write(..., stderr())ではなくmessage()を使用してください。それはpaste()を一緒に編集する必要はありませんいくつかの引数が必要です。

tryCatch()を使用してステータスコードを返し、ステータスコードを処理します。次

for (i in 1:10) { 
    status <- tryCatch({ 
     if (i < 5) warning("i < 5") 
     if (i > 8) stop("i > 8") 
     0L 
    }, error=function(e) { 
     message(i, ": ", conditionMessage(e)) 
     1L 
    }, warning=function(w) { 
     message(i, ": ", conditionMessage(w)) 
     2L 
    }) 
    if (status != 0L) 
     next 
    message("success") 
} 

プリント

1: i < 5 
2: i < 5 
3: i < 5 
4: i < 5 
success 
success 
success 
success 
9: i > 8 
10: i > 8 
関連する問題