R - 并行处理和ldply错误

时间:2018-01-31 00:23:54

标签: r parallel-processing plyr parallel.foreach httr

我正在尝试使用以下代码在并行进程中进行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

1 个答案:

答案 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"))))