Magrittr正向管道无法将值转发到openXL :: addWorksheet - “错误......:第一个参数必须是工作簿”

时间:2017-07-03 06:47:06

标签: r tidyverse magrittr

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应该

  

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)

返回

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)

1 个答案:

答案 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修改。