【问题标题】:Use lapply with readLines on Variable Length Input在可变长度输入上使用 lapply 和 readLines
【发布时间】:2025-12-10 23:00:01
【问题描述】:

我有一个文本文件,其中每一行都是一个 JSON 对象。我可以很容易地将特定文件读入 R:

lapply(readLines(FILE, n=N, warn=FALSE), fromJSON)

这可能很简单,但我想采用此功能并将其并行应用于多个文件

最好的方法是什么?

【问题讨论】:

  • 您是否已经有了文件列表,并带有适当的路径?
  • 换一个lapply: lapply(FILES, function(FILE) lapply(readLines(FILE, n=N, warn=FALSE), fromJSON))
  • @jbaums 不会是一个非常讨厌的列表吗?
  • @RicardoSaporta 好吧,它会返回一个列表,其中的每个元素都是一个列表,其中包含fromJSON 返回的元素。
  • @RicardoSaporta 我愿意。我的想法是我会将文件路径向量传递给函数。但正如 cmets 所指出的,这可能是一个令人讨厌的巢列表情况。最后,我想要的只是文本文件中每一行的一个列表条目。我希望我可以利用多核处理。

标签: json r parallel-processing readline


【解决方案1】:

这是使用parLapply 的一种解决方案:

f <- function(x) lapply(readLines(x, n=N, warn=FALSE), fromJSON)
library(parallel)
cl <- makeCluster(detectCores())
unlist(parLapply(cl, FILES, f), recursive=FALSE)
# where FILES is a vector of file paths

【讨论】:

  • 感谢您的帮助。上面的代码产生了以下错误:Error in checkForRemoteErrors(val) : 2 nodes produced errors; first error: object 'fromJSON' not found but fromJSON is loaded
  • 其实,我相信我是用这个post 弄明白的。对我来说,解决方法是clusterExport(cl, c("fromJSON", "N", "FILES")),其中 N 是一个参数,用于告诉 readLines 要读取多少行。字符串让我看了一会儿,但它似乎有效。谢谢!