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
コマンドを発行して、目的のメッセージを返す方法がありますか?