与xlsx包和choose.files冲突。

45
我在加载xlsx包和使用choose.files时遇到了一个奇怪的问题。
这个问题在我更新RStudio到最新版本(v0.97.237)后立即出现。如果我启动RStudio然后加载xlsx(即library(xlsx)),包可以正常加载。然而,如果我尝试使用choose.files(),RStudio会冻结(实际上它会持续运行,无法在没有Win7任务管理器的情况下关闭)。如果我启动RStudio并首先使用choose.files,它可以正常工作。然后再运行library(xlsx),xlsx包将无法加载。它会给出下面的错误。
我尝试重新安装xlsx包(以及xlsxjars和rJava),但没有成功。重新安装Java也没有起作用。
有什么建议吗?我正在使用R v2.15.2。
library(xlsx)  
Loading required package: xlsxjars  
Loading required package: rJava  
Error occurred during initialization of VM  
Could not reserve enough space for object heap  
Error : .onLoad failed in loadNamespace() for 'xlsxjars', details:  
  call: .jinit()  
  error: Cannot create Java virtual machine (-4)  
Error: package ‘xlsxjars’ could not be loaded  

编辑: 这是问题所在。对于任何困惑,我表示抱歉。当我输入以下内容时:
filename<-file.choose() #select file
library(xlsx)
mydata<-read.xlsx(filename,1) #load datafile

我可以成功选择文件名,但是xlsx包无法加载,所以无法打开数据文件。我得到了上面的错误。然而,如果我在关闭并重新启动RStudio之后运行以下代码:
library(xlsx)
filename<-file.choose() #select file
mydata<-read.xlsx(filename,1) #load datafile

xlsx包可以正常加载,但是file.choose导致R运行时间过长,脚本会冻结,无法加载文件。使用choose.files()也是同样的情况。我不知道为什么这两个东西(xlsx和file.choose/choose.files)会冲突,但是看起来它们确实冲突了,因为我只能使用其中一个,取决于我先使用哪一个。
编辑2: 我在另一台电脑上尝试了一下(相同的操作系统,相同的R、RStudio和Java版本),结果出现了同样的问题。
编辑3: 我转回了RStudio v0.97.90,问题就解决了。我猜这是一个RStudio的问题。

如果我不使用choose.files,xlsx包可以完美加载和运行。唯一无法正常工作的情况是在使用choose.files后尝试加载它。我有Java版本1.7.0_09。 - James
我无法在安装了R 3.0.2和RStudio 0.98.501的Windows 7 x64上复现这个问题。你还遇到这个问题吗? - nograpes
5
问题在于从 R 2.15.2 开始,C 栈大小增加到了 64MB(因为像这样的错误而在 R 3.x.x 中降回了 16MB)。在调用 file.choose() 后看到您的错误消息“无法为对象堆保留足够的空间”,该函数似乎使用了一些内存。我猜在调用 library(xlsx) 之前调用 .jinit(parameters=c("-Xrs", "-Xss1m")) 将解决此问题。 - Kornelius Rohmeyer
你向RStudio团队报告了这个bug吗? - Karl Forner
1
我建议您使用WriteXLS软件包:{WriteXLS} 在我看来,这个软件包更适合Rstudio。 - Sander Van der Zeeuw
显示剩余7条评论
6个回答

1

我总是在顶部使用这些行:

options(java.parameters="-Xmx4000m")
options(java.home="C:/Program Files/Java/jre7/")

看看这是否有帮助。

0

尝试使用这些软件包:

install.packages("XLConnect")
install.packages("xlsxjars")
install.packages("xlsx")

然后加载 library()

使用 read.xlsx2("blah.xlsx",sheetIndex=NULL)

不要使用 file.choose,直接将文件插入到 read.xlsx2 函数中

或者

read.xlsx2("blah.xlsx",sheetName=NULL")

当您从包 xlsx 调用 read.xlsx2() 时,安装 XLConnect 的好处是什么? - Uwe
XLConnect是一个包,允许在R内部读取、写入和操作Microsoft Excel文件。这只是另一种读取Excel文件的方式。我只是提供了关于以其他方式读取Excel文件的建议。但是对于xlsx文件,您确实需要xlsxjars包。 - mikeymike
两个软件包的目标相同:XLConnect:提供全面的功能来读取、写入和格式化Excel数据。xlsx:提供R函数来读取/写入/格式化Excel 2007和Excel 97/2000/XP/2003文件格式。然而,XLConnect还依赖于其他软件包XLConnectJarsrJava(需要一起安装)。 - Uwe
2
我建议使用 openxlsx,它具有完整的功能,并且不依赖于Java。 - Stefan F

0

最近我在新机器上安装R时遇到了这个问题。请确保您使用的Java版本(32位与64位)与您的R版本匹配。请注意,64位版本的Java不在它们的主要下载页面上,而是在他们的“手动”下载页面这里


0

尝试清除您的临时文件:

控制面板 > 程序 > Java

看看是否有效。


0
我建议使用Hadley的readxl包,它可以在CRAN上安装,而且不需要Java依赖。
library("readxl")
my_data <- read_excel(filename, sheet = 1)

0

其中一个较新的软件包是rio软件包。它解决了我遇到的许多导入和导出问题,而且只需要一个库来导入/导出不同的格式文件,这是其额外的好处。它根据文件名扩展名确定格式,同时似乎比其他一些包运行更干净,速度更快,即使使用基本相同的函数。例如,在Excel文件中,它使用write.xlsx函数,但在大型数据集上,当write.xlsx无法使用时,它仍然可以正常工作。详细信息可在此处找到here

install.packages("rio")    
library(rio)

import("myfile.xlsx")
export(df, "myfile.xlsx")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接