【问题标题】:R - Parallel Processing and ldply errorR - 并行处理和 ldply 错误
【发布时间】:2018-01-31 00:23:53
【问题描述】:

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

只有当我尝试使用并行时它才会失败,否则它会起作用。在 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()

func.tot.time

【问题讨论】:

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


    【解决方案1】:

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

    您的loopfunction() 引用了一个名为pairs 的对象。从您的脚本看来,一个名为 pairs 的变量是在您的本地环境中的某个地方定义的。但是,当loopfunction() 传递给ldply() 时,它不再有权访问该变量(通常可以,但并行化需要创建新的 R 环境)。在环境中未能找到名为pairs 的对象后,R 继续搜索,并在stats::pairs() 中找到匹配项。这是一个绘图函数,而不是像向量或数据框这样的子集对象。因此,错误消息“'closure' 类型的对象不是子集”。

    我不是特别熟悉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"))))
    

    【讨论】:

    • 听起来可能就是这样。我没有附上整个代码,因为它很长,但是“pairs”对象是在代码的前面创建的。如何将其传递给并行运行?
    • 编辑了我的答案以提供有关如何执行此操作的建议
    • 朝着正确的方向前进,但由于某种原因,现在我得到:任务 1 失败 - “找不到函数“GET”。我猜 .paropts = c("httr", "jsonlite", " dplyr") 实际上并没有导入 "httr" 库
    • 我想你其实想要.paropts = list(.packages = c("httr", "jsonlite", "dplyr"))
    • 谢谢!我还必须导入 klines 对象,但现在它似乎已经奏效了!我仍然收到 1 的警告:: ... 可能在不正确的上下文中使用:'.fun(piece, ...)' 但只需抽查创建的 data.frame,它似乎还是正确的跨度>
    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 2015-02-16
    • 2015-09-27
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多