R中使用foreach时报错:无适用于list类对象的'filter'方法
报错原因
- 根本原因是运算符优先级问题:R中管道符
%>%的优先级高于foreach的%do%/%dopar%运算符,你写的代码实际执行顺序为:- 先执行
foreach(ID = 1:10) %do% tbl,返回包含10个tbl tibble的列表 - 再将该列表传入
filter(id == ID),dplyr的filter未针对list类实现适配方法,因此抛出对应报错
普通for循环不存在运算符优先级冲突,因此可以正常运行。
- 先执行
解决方法
只要给foreach的循环体加上大括号{}明确执行作用域,即可修正问题,修改后的代码如下:
library(dplyr) library(doFuture) library(foreach) # 并行处理配置 registerDoFuture() plan(multicore, workers = 1) tbl <- tibble(id = 1:10) # 给循环体加{}明确执行顺序 res <- foreach(ID = 1:10) %do% { tbl %>% filter(id == ID) } # 也可以用小括号包裹整个管道表达式,效果一致 # res <- foreach(ID = 1:10) %do% (tbl %>% filter(id == ID))
修改后得到的res和你普通for循环生成的l列表内容完全一致。
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

