2016-08-12 4 views
0

リンクを含む表を使用してPDFをダウンロードしようとしています。リンクのフォーマットが一貫していないため、私は同じリンクの異なるバージョンを別々の列に作成しました。プライバシーの理由から私はリンクを公開することはできませんが、ここで私がしたことがあります。すべてのバージョンと名前を作成した後Rを使用してウェブのPDFをダウンロードしようとする

links <- data.frame(links1,links2,links3,links4) 
filenames <- str_c(format(seq.Date(from = as.Date("2015-04-01"), 
           to = Sys.Date(), by = "day"),"%Y_%m_%d"),".pdf") 

、ここで私は正しいされていないリンクにもかかわらず、継続してTry-Catchに包まれたループを記述してみてください。私の目標は、列links$links1[3]上のリンクが、同じ行の他の列を見て作業リンクを見つけることができないときです。その2015年およびおそらく他の日付あまりにも4月9日にアップロードされたPDFファイルを拾っていないいくつかの理由

for (i in seq_along(links[,1])) { 
     #using trycatch to bipass the error when url doesn't exist 
     tryCatch({ 
     if (!file.exists(str_c(folder,"/",filenames[i]))) { 
        download.file(links[i,1], filenames[i], mode = "wb") 
      print(paste0("Downloading: ", filenames[i])) 
        } }, error = function(e){ 

          for (j in seq_along(links[i,])){ 
           tryCatch({ 

           download.file(links[i,j], filenames[i], mode = "wb") 
          }, error = function(e){} 

         ) 
          } 
        } 

    ) 


} 

は、ここに私の試みです。

+0

あなたはあなたの範囲に '2015_04_09'を含めています。その日や他の日にアップロードがなかった可能性はありますか? –

+0

URLをブラウザに貼り付けたところ、PDFがあります。 – Jomisilfe

+0

これは公衆インターネット上の認証されていないウェブサイトであれば、プライバシーはなく、私はこれらが敏感なPDFであることを願っています。あなたが 'httr :: GET(url、httr :: write_disk(filename)、httr()を使用した場合、Webサイトのファイアウォールを起動させるか、 :: verbose() 'あなたは実際のエラーが生成されているのを見ることができます。 – hrbrmstr

答えて

0

for (j in seq_along(links[i,])){は、内部ループがすでに失敗したリンクを再試行する原因となります。リンクが失敗すると、内部ループで再び失敗します。あなたのプログラムは幸せに続き、他のリンクを試したことはありません。

内側のforループでj = 1をスキップする必要があります。

ここには、何が起こっているかを示すプログラムのわずかに修正されたバージョンがあります。

links1 <- c('a','b','c') 
links2 <- c('x','y','z') 

links <- data.frame(links1,links2) 

for (i in seq_along(links[,1])) { 
    #using trycatch to bipass the error when url doesn't exist 
    tryCatch({ 
     print(sprintf("trying: %s", links[i,1])) 
     if(i == 2) { 
      stop(simpleError("error")) 
     } 
    }, 
    error = function(e){ 
     for (j in seq_along(links[i,])){ 
     tryCatch({ 
      print(sprintf("falling back to %s", links[i,j])) 
     }, 
     error = function(e){ 

     }) 
     } 
    }) 
    } 
関連する問題