使用purrr::map写入Excel文件时触发asTable逻辑错误
问题解决:write.xlsx报错"asTable must be a logical"
错误原因
你的代码在使用管道传递.x给write.xlsx时,额外显式指定了x = .x,导致参数传递冲突。管道会自动把左侧的.x作为write.xlsx的第一个参数(即x参数),重复赋值x=.x会打乱参数解析顺序,使得asTable参数接收到非逻辑值,触发报错。
修正后的代码
方案1:移除多余的x=.x
直接利用管道传递数据,无需重复指定x参数:
library(tidyverse) library(openxlsx) mtcars |> group_split(cyl) |> map(.f = ~ .x |> write.xlsx(file = paste0(getwd(), "/", unique(.x$cyl), "/", "test.xlsx")))
方案2:添加文件夹创建逻辑(更健壮)
如果目标文件夹不存在,写入Excel会失败,以下代码先检查并创建文件夹:
library(tidyverse) library(openxlsx) mtcars |> group_split(cyl) |> map(function(df) { # 构建目标文件夹路径 folder_path <- paste0(getwd(), "/", unique(df$cyl)) # 文件夹不存在则创建(recursive=TRUE支持嵌套创建) if (!dir.exists(folder_path)) { dir.create(folder_path, recursive = TRUE) } # 写入Excel文件 write.xlsx(df, file = paste0(folder_path, "/test.xlsx")) })
关键提示
- 调用
write.xlsx时,管道已自动完成第一个参数(数据对象)的传递,无需重复指定x=数据对象。 - 务必确保目标文件夹存在,否则会出现文件路径不存在的错误,方案2的代码可以避免这个问题。
内容的提问来源于stack exchange,提问作者deschen
相关产品推荐
相关产品推荐

