我正在尝试使用以下代码在并行进程中进行API调用以加快API调用。 (我知道这不是加速API调用的最好方法,但它有效)
当我尝试使用并行时它才会失败,否则它会起作用。在ldply函数中,我得到以下错误:
do.ply(i)出错: 任务1失败 - “类型'闭包的对象'不是子集” 另外:
警告讯息:
1 :: ...可能在错误的上下文中使用:'。fun(piece,...)'
2 :::可能在错误的上下文中使用:'。fun(piece,...)'
任何帮助将不胜感激!
One <- 26
cl<-makeCluster(4)
registerDoSNOW(cl)
func.time <- Sys.time()
## API CALL ONE FOR "kline"
url <- "https://api.binance.com"
path <- paste("/api/v1/klines?symbol=",pairs[1],"&interval=1m&limit=1", sep = "")
raw.results <- GET(url = url, path = path)
text_content <- content(raw.results, as = "text", encoding = "UTF-8")
kline <- data.frame(text_content %>% fromJSON())
kline$symbol <- pairs[1]
## API FUNCTION TO BE APPLIED FOR REST
loopfunction <- function(i){
url <- "https://api.binance.com"
path <- paste("/api/v1/klines?symbol=",pairs[i],"&interval=1m&limit=1", sep = "")
raw.results <- GET(url = url, path = path)
text_content <- content(raw.results, as = "text", encoding = "UTF-8")
kline_temp <- data.frame(text_content %>% fromJSON())
kline_temp$symbol <- pairs[i]
kline <- rbind(kline,kline_temp)
return(kline)
}
## DPLY PARALLEL FUNCTION
kline2 <- data.frame(ldply(2:(One - 1), .fun = loopfunction, .parallel = T, .paropts = c("httr", "jsonlite", "dplyr"))) ##"ONE" is a list varriable created earlier
stopCluster(cl)
func.end.time <- Sys.time()
func.tot.time&lt; - func.end.time - func.time
答案 0 :(得分:2)
您的问题不完全可重复,因此以下是有根据的猜测。
您的loopfunction()
引用了一个名为pairs
的对象。从您的脚本看来,在本地环境中的某处定义了一个名为pairs
的变量。但是,当loopfunction()
传递给ldply()
时,它不再能够访问该变量(通常情况下,它会,但并行化需要创建新的R环境)。在环境中找不到名为pairs
的对象后,R继续搜索,并在stats::pairs()
中找到匹配项。这是一个绘图函数,而不是像矢量或数据框这样的子集化对象。因此错误消息“类型'闭包的对象'不是子集”。
我对ldply
如何实现并行处理并不是特别熟悉,但你可能会像这样修改你的函数定义:
loopfunction <- function(i, pairs) {
...[body of function]...
}
并将pairs
作为ldply
来电中的额外参数传递:
kline2 <- data.frame(ldply(2:(One - 1), .fun = loopfunction, pairs = pairs, .parallel = T, .paropts = list(.packages = c("httr", "jsonlite", "dplyr"))))