magrittr
似乎无法将“工作簿”类对象从包addWorkbook
中导入openxlsx
函数。
(没关系,为什么我需要使用excel ... eugh yuk )
例如,要使用'base'语法将InsectSprays
数据集写入excel文件:
library("openxlsx")
insect.wb <- createWorkbook()
addWorksheet(wb = insect.wb,
sheetName = "Insect Spray")
writeData(wb = insect.wb,
sheet = "Insect Spray",
x= InsectSprays)
openXL(insect.wb)
打开包含数据的临时excel文件。
所以magrittr
应该
但是,例如。
library("openxlsx")
library("magrittr")
insect.wb <- createWorkbook()
insect.wb %>%
addWorksheet(sheetName = "Insect Spray") %>%
writeData(sheet = "Insect Spray",
x= InsectSprays)
返回
Error in writeData(., sheet = "Insect Spray", x = InsectSprays) : First argument must be a Workbook.
但是insect.wb
是一个工作簿对象:
> insect.wb <- createWorkbook()
> class(insect.wb)
[1] "Workbook"
attr(,"package")
[1] "openxlsx"
这表明问题在于对象没有被用来管道......
我只是在弄乱语法,还是有一个更有趣的解释为何失败?
有兴趣的话,前向管道和writeData
没有问题 - 如果我们将前向管道的使用转移到addWorksheet
之后,它也可以正常工作:
insect.wb <- createWorkbook()
addWorksheet(wb = insect.wb,
sheetName = "Insect Spray")
insect.wb %>%
writeData(sheet = "Insect Spray",
x= InsectSprays)
openXL(insect.wb)
答案 0 :(得分:1)
在命令链中,writeData将insect.wb %>% addWorksheet(sheetName = "Insect Spray")
addWorksheet直接修改对象,并且不会返回对象,因此无论你传递给writeData的是什么,都不是工作表(从你的评论来看,它可能是你之后的工作表数量)加)。
您可以使用运算符%T>%
并编写
insect.wb %T>%
addWorksheet(sheetName = "Insect Spray") %>%
writeData(sheet = "Insect Spray", x= InsectSprays)
%T>%
启动一个新链,意思是没有返回rhs的输出,但是返回了lhs,所以writeData将它带到%T>%
左边,除了{{1} } {现在已被insect.wb
修改。