2017-09-13 69 views
1

我使用R軟件包rnoaa(以及它需要其他軟件包)來收集歷史氣象數據。我編寫了這個嵌套循環來收集所有的數據集,但是當我運行它時,我總是收到錯誤。這似乎爲第二運行良好Nestled Loop不能收集來自NOAA的數據

循環:

require('triebeard') 
require('bindr') 
require('colorspace') 
require('mime') 
require('curl') 
require('openssl') 
require('R6') 
require('urltools') 
require('httpcode') 
require('stringr') 
require('assertthat') 
require('bindrcpp') 
require('glue') 
require('magrittr') 
require('pkgconfig') 
require('rlang') 
require('Rcpp') 
require('BH') 
require('plogr') 
require('purrr') 
require('stringi') 
require('tidyselect') 
require('digest') 
require('gtable') 
require('plyr') 
require('reshape2') 
require('lazyeval') 
require('RColorBrewer') 
require('dichromat') 
require('munsell') 
require('labeling') 
require('viridisLite') 
require('data.table') 
require('rjson') 
require('httr') 
require('crul') 
require('lubridate') 
require('dplyr') 
require('tidyr') 
require('ggplot2') 
require('scales') 
require('XML') 
require('xml2') 
require('jsonlite') 
require('rappdirs') 
require('gridExtra') 
require('tibble') 
require('isdparser') 
require('geonames') 
require('hoardr') 
require('rnoaa') 
install.package('ncdf4') 

install.packages("devtools") 
library(devtools) 
install_github("rnoaa", "ropensci") 
library(rnoaa) 


list <- buoys(dataset='wlevel') 
lid <- data.frame(list$id) 
foo <- for(range in 1990:2017){ 
for(bid in lid){ 
bid_range <- buoy(dataset = 'wlevel', buoyid = bid, year = range) 
bid.year.data <- data.frame(bid.year$data) 
write.csv(bid.year.data, file='cwind/bid_range.csv') 
} 
} 

響應:

Using c1990.nc 
Using 
Error: length(url) == 1 is not TRUE 

它保存第一個數據集,但它並沒有在文件名中應用的它只是將它命名爲bid_range.csv。

+0

對於'write.csv()'檢查您的工作目錄,或者嘗試指定完整的文件路徑。 – Mako212

+0

另外,不要用點來命名文件,使用下劃線或劃線bid_year.csv或bid-year.csv – Mako212

+0

我做了這些更改並添加了一個令牌密鑰仍然無效 – farmerm3

回答

1

此錯誤消息顯示在1990年沒有給定工作站ID的任何數據。因爲您使用for循環,一旦它發生錯誤,它會停止。

這裏我介紹一下使用tidyverse來下載NOAA浮標數據。 purrr程序包中有許多以下功能,它們是tidyverse的一部分。

# Load packages 
library(tidyverse) 
library(rnoaa) 

第1步:創建一個「網格」包含ID和今年的所有組合

tidyrexpand功能可以創建不同值的組合。

data_list <- buoys(dataset = 'wlevel') 

data_list2 <- data_list %>% 
    select(id) %>% 
    expand(id, year = 1990:2017) 

第2步:創建一個「安全」的版本時,不存在數據不破。 也使此功能適用於MAP2功能

因爲我們將通過它的.x.y參數使用map2功能使用map2遍歷的idyear所有的組合。我們修改了參數的順序以創建buoy_modify。我們還使用safely函數創建版本的buoy_modify。現在,當它遇到錯誤時,它將存儲錯誤消息並移到下一個錯誤消息而不是中斷。

# Modify the buoy function 
buoy_modify <- function(buoyid, year, dataset, ...){ 
    buoy(dataset, buoyid = buoyid, year = year, ...) 
} 

# Creare a safe version of buoy_modify 
buoy_safe <- safely(buoy_modify) 

第3步:應用buoy_safe功能

wlevel_data <- map2(data_list2$id, data_list2$year, buoy_safe, dataset = "wlevel") 

# Assign name for the element in the list based on id and year 
names(wlevel_data) <- paste(data_list2$id, data_list2$year, sep = "_") 

此步驟後,所有數據wlevel_data進行下載。 wlevel_data中的每個元素都有兩個部分。 $result顯示下載成功時的數據,否則顯示NULL。如果下載成功,則$error顯示NULL,否則顯示錯誤消息。

第4步:訪問數據

transpose可以把清單 「內而外」。所以現在wlevel_data2有兩個元素:結果和錯誤。我們可以存儲這兩個並訪問數據。

# Turn the list "inside out" 
wlevel_data2 <- transpose(wlevel_data) 

# Get the error message 
wlevel_error <- wlevel_data2$error 

# Get he result 
wlevel_result <- wlevel_data2$result 

# Remove NULL element in wlevel_result 
wlevel_result2 <- wlevel_result[!map_lgl(wlevel_result, is.null)]