我正在尝试创建一个应用程序,以便更轻松地查看对 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)