Magrittr 转发管道无法将值转发到 openXL::addWorksheet - "Error ...: First argument must be a Workbook"

Magrittr forward pipe fails to forward values into openXL::addWorksheet - "Error ...: First argument must be a Workbook"

magrittr 似乎无法将 'workbook' class 对象从包 openxlsx 传送到 addWorkbook 函数。

(没关系为什么我需要使用 excel...好吧)

例如,以 '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应该

pipe a value forward into an expression or function call; something along the lines of x %>% f, rather than f(x)

但是例如

library("openxlsx")
library("magrittr")
insect.wb <- createWorkbook()
insect.wb %>%
  addWorksheet(sheetName = "Insect Spray") %>%
  writeData(sheet = "Insect Spray",
            x= InsectSprays)

Returns

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)

在您的命令链中,writeData 将 insect.wb %>% addWorksheet(sheetName = "Insect Spray")

的输出作为第一个输入

addWorksheet 直接修改对象,而不是 return 对象,因此无论您传递给 writeData 什么都不是工作表(根据您的评论,它可能是添加后的工作表数) .

您可以使用运算符 %T>% 并写入

insect.wb %T>%
  addWorksheet(sheetName = "Insect Spray") %>%
  writeData(sheet = "Insect Spray", x= InsectSprays)

%T>% 在 rhs 的输出不是 returned 而 lhs 是 returned 的意义上开始一个新的链,然后 writeData 将它带到 %T>% 离开了,只是 insect.wb 现在已经被 addWorksheet 修改了。