R-并行处理与ldply误差
我试图使用下面的代码在并行进程中进行API调用,以加快API调用的速度。(我知道这不是加速API调用的最佳方法,但它确实有效) 只有当我尝试使用parallel时,它才会失败,否则它就会工作。在ldply函数中,我得到以下错误: do.ply(i)中的错误: 任务1失败-“类型为“closure”的对象不可子集” 此外: 警告信息: 1::。。。可能在不正确的上下文中使用:'.fun(piece,…)' 2::。。。可能在不正确的上下文中使用:'.fun(piece,…)' 任何帮助都将不胜感激R-并行处理与ldply误差,r,parallel-processing,plyr,parallel.foreach,httr,R,Parallel Processing,Plyr,Parallel.foreach,Httr,我试图使用下面的代码在并行进程中进行API调用,以加快API调用的速度。(我知道这不是加速API调用的最佳方法,但它确实有效) 只有当我尝试使用parallel时,它才会失败,否则它就会工作。在ldply函数中,我得到以下错误: do.ply(i)中的错误: 任务1失败-“类型为“closure”的对象不可子集” 此外: 警告信息: 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()
One您的问题不是完全可重复的,因此以下是一个有根据的猜测
您的loopfunction()
引用了一个名为pairs
的对象。从脚本中可以看出,在本地环境的某个地方定义了一个名为pairs
的变量。但是,当loopfunction()
被传递给ldply()
时,它不再具有对该变量的访问权限(通常会,但并行化需要创建新的R环境)。在环境中找不到名为pairs
的对象后,R继续搜索,并在stats::pairs()
中找到匹配项。这是一个绘图函数,而不是像矢量或数据帧那样的子可附着对象。因此会出现错误消息“类型为“closure”的对象不可再附加”
我对ldply
如何实现并行处理不是特别熟悉,但您可能会这样修改您的函数定义:
loopfunction <- function(i, pairs) {
...[body of function]...
}
听起来很有可能。我没有附加整个代码,因为它很长,但是“pairs”对象是在代码的前面创建的。如何将其传递到并行运行?编辑了我的答案,提供了一个关于如何在正确方向上执行此步骤的建议,但由于某些原因,现在我得到了:任务1失败-“找不到函数“get”。我猜。paropts=c(“httr”、“jsonlite”、“dplyr”)实际上并没有导入“httr”库。我认为您实际上想要。paropts=list(.packages=c(“httr”,“jsonlite”,“dplyr”))
。谢谢!我还必须导入klines对象,但现在它似乎已经工作了!我仍然收到一条警告:1::…可能在不正确的上下文中使用:'.fun(piece…)。但只要抽查创建的data.frame,它看起来无论如何都是正确的
kline2 <- data.frame(ldply(2:(One - 1), .fun = loopfunction, pairs = pairs, .parallel = T, .paropts = list(.packages = c("httr", "jsonlite", "dplyr"))))