0

我正在创建我的第一个 R 包,以帮助同事执行一系列相对复杂的数据处理任务。我有很多 R 函数可以帮助数据清理和分析,但我正在尝试添加一些可以简化工作流程以提高速度和减少错误的东西。

我的用户当前必须执行的步骤之一是创建一系列特定的目录和子目录,稍后将在其中存储不同的文件。接下来,我有一个需要插入特定文件夹的 Excel 工作簿模板。目前,我可以使用 R 代码创建目录,但用户必须手动将 Excel 模板复制到正确的位置。我希望使用 R 函数自动执行此操作,因为我观察到如果手动完成此步骤很容易出错 - 将模板复制到错误的目录中,在错误的位置使用错误的模板版本,等等

值得注意的是,我尝试使用 R 函数重新生成的 Excel 工作簿模板非常复杂。它包含少量数据,然后是一堆格式和隐藏公式。由于遗留原因,工作簿模板必须保持原样。由于它的复杂性,我不确定我是否可以使用 R 函数从头创建模板,这些函数放入基础数据中,设置格式,然后设置复杂的公式规则而不会引入错误。

到目前为止,我的方法是使用:

myWB<-XLConnect::loadworkbook("C:/My Docs/Template.xlsx")

为了从我本地存储在我的机器上的 Excel 模板的副本创建一个 XLConnect“工作簿”对象。

如果我str()用来检查我新创建的工作簿对象,我会看到:

Formal class 'workbook' [package "XLConnect"] with 2 slots
  ..@ filename: chr "C:/My Docs/Template.xlsx"
  ..@ jobj    :Formal class 'jobjRef' [package "rJava"] with 2 slots
  .. .. ..@ jobj  :<externalptr> 
  .. .. ..@ jclass: chr "com/miraisolutions/xlconnect/integration/r/RWorkbookWrapper"

当我在同一个 R 会话中交互工作时,这非常适合复制 .xlsx 模板的副本。我可以用:

XLConnect::saveWorkbook(myWorkbook,file="C:/some new folder/new copy of my template.xlsx")

然后我可以进入“一些新文件夹”,果然,“我的 template.xlsx 的新副本”是我的原始模板的全功能副本,在新文件夹中。

问题是我希望我的 Excel 模板工作簿作为某种类型的对象存在于我的包中,R 可以使用该对象在安装了我的包的任何人的机器上重新创建工作簿,而无需获取Excel 文件,将其存储在某处,将其移动等。我尝试过,因此使用devtools::use_data(myWB)以将 myWB 对象作为数据存储在我的包的数据文件夹中作为 .rda 文件(我也尝试了此函数,内部设置为 FALSE为了将 myWB 作为 sysdata.rda 存储在 R/ 中)。

LazyData: TRUE然后我在描述文件中构建我的包。我想用来XLConnect::saveWorkbook(myWB,"C:/New folder/copy of template.xlsx")在正确的目录中复制我的模板以供包使用。包中的函数可以看到 myWB 对象,所以我知道它实际上是延迟加载的,当我检查时,str(myWB)一切看起来都完好无损:

Formal class 'workbook' [package "XLConnect"] with 2 slots
      ..@ filename: chr "C:/My Docs/Template.xlsx"
      ..@ jobj    :Formal class 'jobjRef' [package "rJava"] with 2 slots
      .. .. ..@ jobj  :<externalptr> 
      .. .. ..@ jclass: chr "com/miraisolutions/xlconnect/integration/r/RWorkbookWrapper"

但是,当我运行 XLConnect::saveWorkbook(myWB,"C:/New folder/copy of template.xlsx")` 时,出现以下错误:

Error: NullPointerException (Java):

我对Java一无所知,但我猜XLConnect创建的myWB对象是一个java对象,当我将对象作为数据保存在我的R包中时,我丢失了一些东西(指针?)。

我接下来要尝试什么?

谢谢你。

PS 我对 Stack Overflow 还很陌生,正在尝试学习如何提出一个好问题。我真的很难为这个问题创建一个可重现的示例,因为它需要您创建一个新的 R 包并手头有我的 Excel 模板的副本。幸运的是,错误似乎与我的模板的细节无关。我希望我在解释情况和我尝试过的方面做了合理的工作,但我会很感激有关创建更好问题的反馈。

4

0 回答 0