使用自定义plyr函数聚合Mindware文件时出错求助
问题描述
我用一个函数聚合Mindware程序生成的大量Excel文件,半年前运行正常,现在用ldply批量处理时报错,但单独用mw()处理单个文件没问题。已尝试升降级plyr、重装所有包,仍无法解决,函数作者也不清楚原因。
相关代码
单个文件处理函数mw
mw <- function (filename) { require(readxl) require(magrittr) d <- read_excel(filename) names(d) <- NULL newd <- data.frame( row = t(as.vector(d[6, 2:ncol(d)])) %>% as.numeric(), video = t(as.vector(d[3, 2:ncol(d)])) , id = filename) newd <- subset(newd, is.na(time) == F) }
批量处理代码
library(magrittr) library(foreach) library(plyr) setwd("#set wd here") my_physio_data <- ldply(.data = list.files(pattern="*.xlsx"), .fun = mw, .parallel = TRUE)
报错信息
Error in do.ply(i) : task 82 failed - "attempt to apply non-function"
解决思路
- 排查第82个文件:报错明确指向第82个任务,先提取该文件(
list.files(pattern="*.xlsx")[82])单独用mw()测试,检查是否存在文件损坏、格式异常或内容缺失的情况。 - 修复函数逻辑漏洞:当前
mw函数里的subset(newd, is.na(time) == F)存在明显问题——newd的列只有row、video、id,根本没有time列,这会导致subset执行失败,返回异常对象,批量处理时触发“非函数应用”错误。要么把过滤条件改成实际存在的列(比如is.na(row) == F),要么直接删除这行代码;同时确保函数明确返回处理后的newd(可以加return(newd),或保留最后一行的返回逻辑)。 - 关闭并行测试:
plyr的.parallel=TRUE依赖foreach和并行后端,可能是并行环境下包加载、变量作用域出了问题。先把.parallel改成FALSE运行,若正常,再手动配置并行环境:library(doParallel) cl <- makeCluster(detectCores()) registerDoParallel(cl) # 再执行ldply代码 stopCluster(cl) - 替换为更稳定的工具:
plyr已停止维护,换成purrr::map_dfr更可靠,示例代码:library(purrr) library(readxl) library(magrittr) mw_fixed <- function(filename) { d <- read_excel(filename) names(d) <- NULL newd <- data.frame( row = t(as.vector(d[6, 2:ncol(d)])) %>% as.numeric(), video = t(as.vector(d[3, 2:ncol(d)])), id = filename ) # 修正过滤逻辑,比如过滤row为空的行 newd[!is.na(newd$row), ] } my_physio_data <- list.files(pattern="*.xlsx") %>% map_dfr(mw_fixed) - 核对包版本差异:用
sessionInfo()输出当前所有包的版本,对比半年前的环境记录(如果有),重点检查readxl、magrittr、plyr的版本变化,尝试回退到之前的稳定版本。
内容的提问来源于stack exchange,提问作者socialresearcher
相关产品推荐
相关产品推荐

