我正在创建我的第一个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存储在R /中作为sysdata.rda)。
然后我在描述文件中使用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:/新文件夹/ template.xlsx的副本”)时,我收到以下错误:
Error: NullPointerException (Java):
我对Java一无所知,但我想XLConnect创建的myWB对象是一个java对象,当我将对象保存为R包中的数据时,我正在丢失一些东西(一个指针?)。
接下来我该尝试什么?
谢谢。
P.S。我是Stack Overflow的新手,我正在努力学习如何提出一个好问题。我真的很难为这个问题创建一个可重现的例子,因为它需要你创建一个新的R包并拥有我的Excel模板的副本。幸运的是,错误似乎与我的模板的细节无关。我希望我能够合理地解释情况和我所尝试的内容,但我很感激有关创建更好问题的反馈意见。