0

我正在尝试创建一个应用程序,以便更轻松地查看对 Crypto 的投资。下面的代码(可重现的示例)从CoinMarketCap api下载数据(不包括密钥)。总是第一次编译代码时它工作正常,但是,当我多次编译所有代码时,在某些尝试中我得到了错误:

Error in names(x) <- value : 
  'names' attribute [10] must be the same length as the vector [1]

由于我的应用程序是通过 shinydashboard 进行的,并且我必须不断更新闪亮,因此我多次收到此错误。我进行了堆栈搜索,并在此链接上找到了一些建议,包括 Hadley 的回答,但我无法解决问题!我相信这个错误与pblapply函数的应用有关!你有什么建议吗?

rm(list = ls())
cat("\014")
require("pbapply");require("data.table");require("httr");require("rvest");require("dplyr")
require("lubridate");require("jsonlite")
PASS <- new.env()
assign("apikey","Key Here",envir = PASS)
# HELPER FUNCTION - Converts timestamp to local timestamp
# format TimeZone
fixTZ = function(timeStamp){
  tmDIFF = round(as.numeric(difftime(Sys.time(),
                                     lubridate::force_tz(with_tz(Sys.time(),tz="UTC")),
                                     units = "hours")),0)
  as.POSIXct(timeStamp + hours(tmDIFF), tz= Sys.timezone())
}

getLatestQuote= function(symbol, fiat)
{
  # build URL
  url = paste0("https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest",
               "?convert=",fiat,"&symbol=",symbol)
  # GET request
  pg <- httr::GET(url,httr::add_headers(`Accepts` = 'application/json',
                                        `X-CMC_PRO_API_KEY` = PASS$apikey))
  # read in content
  dt<- fromJSON(rawToChar(pg$content))
  
  # extract quote
  qte <- rbindlist(dt$data[[1]]$quote) %>% as.data.frame()
  # format column types
  qte$price <- as.numeric(qte$price)
  qte$price <- round(qte$price, 5)
  qte$percent_change_1h <- round(qte$percent_change_1h/100,5)
  qte$percent_change_24h <- round(qte$percent_change_24h/100,5)
  qte$percent_change_7d <- round(qte$percent_change_7d/100,5)
  qte$percent_change_30d <- round(qte$percent_change_30d/100,5)
  qte$percent_change_60d <- round(qte$percent_change_60d/100,5)
  qte$percent_change_90d <- round(qte$percent_change_90d/100,5)
  qte$market_cap_dominance<-round(qte$market_cap_dominance/100,5)
  qte$last_updated <- fixTZ(as.POSIXct(qte$last_updated, format="%Y-%m-%dT%H:%M:%S.000Z"))
  
  # add Meta
  meta <- as.data.frame(cbind(dt$data[[1]]$id,
                              dt$data[[1]]$name,
                              dt$data[[1]]$symbol,
                              dt$data[[1]]$slug,
                              dt$data[[1]]$num_market_pairs,
                              dt$data[[1]]$date_added,
                              ifelse(is.null(dt$data[[1]]$max_supply), NA,dt$data[[1]]$max_supply),
                              dt$data[[1]]$circulating_supply,
                              dt$data[[1]]$total_supply,
                              dt$data[[1]]$is_active
  ))
  colnames(meta) <- c("id","name","symbol","slug","num_market_pairs",
                      "date_added","max_supply","circulating_supply",
                      "total_supply","is_active")
  meta$date_added <- fixTZ(as.POSIXct(meta$date_added, format="%Y-%m-%dT%H:%M:%S.000Z"))
  # combine meta & qte data
  all <- cbind(meta,qte)
  # return data
  all
  
}
# call multiple quotes:
Moeda = c("ADA" ,  "ATOM" , "HBAR",  "ELMON", "SOL" , "ILV" ,  
          "POLIS", "GALA" , "AVAX",  "TIME", "BNB" ,  "AXS"  , "QI" )

qte <- pblapply(as.list(Moeda), function(x){
  teste <- try(getLatestQuote(symbol=x, fiat="USD"))
  if(!inherits(teste, 'try-error'))
    teste
})

# row bind data
qte <- rbindlist(qte,use.names = TRUE,fill = TRUE)
4

0 回答 0