R-并行处理与ldply误差

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,…)' 任何帮助都将不胜感激

我试图使用下面的代码在并行进程中进行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"))))