R - 并行处理和 ldply 错误

R - Parallel Processing and ldply error

我正在尝试使用以下代码在并行过程中进行 API 调用,以加快 API 调用的速度。 (我知道这不是加快 API 调用的最佳方法,但它确实有效)

只有当我尝试使用并行时它才会失败,否则它会起作用。在 ldply 函数中,我收到以下错误:

do.ply(i) 中的错误: 任务 1 失败 - "object of type 'closure' is not subsettable" 另外:

警告消息:

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 <- func.end.time - func.time

您的问题无法完全重现,因此以下是有根据的猜测。

您的 loopfunction() 引用了一个名为 pairs 的对象。从您的脚本看来,在您的本地环境中某处定义了一个名为 pairs 的变量。但是,当 loopfunction() 传递给 ldply() 时,它不再有权访问该变量(通常情况下,它会,但并行化需要创建新的 R 环境)。由于未能在环境中找到名为 pairs 的对象,R 继续搜索,并在 stats::pairs() 中找到匹配项。这是一个绘图函数,而不是像矢量或数据框这样的子集对象。因此错误消息 "object of type 'closure' is not subsettable".

我不是特别熟悉 ldply 如何实现并行处理,但您可以像这样修改您的函数定义:

loopfunction <- function(i, pairs) {
   ...[body of function]...
}

并在 ldply 调用中将 pairs 作为额外参数传递:

kline2 <- data.frame(ldply(2:(One - 1), .fun =  loopfunction, pairs = pairs, .parallel = T, .paropts = list(.packages = c("httr", "jsonlite", "dplyr"))))