常见问题——Java和xlsx包
以前没有使用过依赖 Java 的包的 R 用户在尝试使用xlsx
用于读取 Excel 电子表格的包时经常会遇到问题。
未安装 Java 运行时
首先,许多新的 R 用户以前不需要在他们的计算机上安装 Java 运行时。包xlsx
依赖于rJava
和xlsxjars
包。 rJava
要求 Java 运行时环境 1.2 或更高版本也存在于自己的计算机上。
解决方案一:使用不需要Java的excel阅读器包
专业提示:解决此问题的最简单方法是使用不依赖于 Java 的 R 包,例如openxlsx或readxl。
因为openxlsx
,这很容易。
install.packages("openxlsx")
library(openxlsx)
# read the help file to identify the arguments needed to
# correctly read the file
?openxlsx
theData <- read.xlsx(...)
相同的过程可用于readxl
.
install.packages("readxl")
library(readxl)
# read the help file to identify the arguments needed to
# correctly read the file
?readxl
theData <- read_excel(...)
解决方案 2:安装 Java 和所需的 R 包
也就是说,对于仍想使用该xlsx
软件包的人来说,有适用于 Windows、Mac OSX 和 Ubuntu Linux 的可行解决方案。
解决方案 (Windows):从 Oracle下载并安装最新版本的Java 运行时环境。请注意,如果您运行的是 64 位版本的 R,则需要安装 64 位版本的 Java Runtime。
解决方案 (Mac OSX):随着 Mac OSX 的更新版本,这变得更加复杂。在计算机上安装 Java 开发工具包后,需要遵循一组特定的命令。这些记录在rJava 第 86 期 github 页面上。
解决方案(Ubuntu):使用 Ubuntu Advanced Packaging Tool 安装 Java,然后在 R 中重新配置 Java。
sudo apt-get install openjdk-8-jdk # openjdk-9-jdk has some installation issues
sudo R CMD javareconf
然后在 R/RStudio 中安装xlsx
包。
install.packages("xlsx")
Windows 中的 32 位与 64 位 Java
人们可能遇到的另一个常见问题是安装在他们计算机上的 Java 运行时环境版本与 R 版本(32 位或 64 位)之间的不兼容。
例如,如果安装了 64 位版本的 R 但安装了 32 位版本的 Java 运行时环境,则 R 将无法看到 Java 运行时环境,产生与上述相同的“Java 未安装错误” .
解决方案:此问题可以通过安装 64 位版本的 Java Runtime for Windows或通过更改 RStudio 配置以使用 32 位版本的 R 来解决。
通过在 R / RStudio 中执行以下函数,可以识别安装的 Java 版本,以及它是 32 位还是 64 位。
system("java -version")
...在基于 Windows 的 PC 上将返回类似这样的内容。
从 Windows 注册表中提取 Java 设置
验证安装在基于 Windows 的机器上的 Java 版本的另一种方法是使用utils::readRegistry()
(h/t Access Windows Registry inside R )。
readRegistry("SOFTWARE\\JavaSoft\\Java Runtime Environment","HLM",maxdepth=3)
返回以下内容:
> readRegistry("SOFTWARE\\JavaSoft\\Java Runtime Environment","HLM",maxdepth=3)
$BrowserJavaVersion
[1] "11.261.2"
$CurrentVersion
[1] "1.8"
$`1.8`
$`1.8`$JavaHome
[1] "C:\\Program Files\\Java\\jre1.8.0_261"
$`1.8`$MicroVersion
[1] "0"
$`1.8`$RuntimeLib
[1] "C:\\Program Files\\Java\\jre1.8.0_261\\bin\\server\\jvm.dll"
$`1.8.0_261`
$`1.8.0_261`$JavaHome
[1] "C:\\Program Files\\Java\\jre1.8.0_261"
$`1.8.0_261`$MicroVersion
[1] "0"
$`1.8.0_261`$RuntimeLib
[1] "C:\\Program Files\\Java\\jre1.8.0_261\\bin\\server\\jvm.dll"
$`1.8.0_261`$MSI
$`1.8.0_261`$MSI$AUTOUPDATECHECK
[1] "1"
$`1.8.0_261`$MSI$AUTOUPDATEDELAY
[1] ""
$`1.8.0_261`$MSI$EULA
[1] ""
$`1.8.0_261`$MSI$FROMVERSION
[1] "NA"
$`1.8.0_261`$MSI$FROMVERSIONFULL
[1] ""
$`1.8.0_261`$MSI$FullVersion
[1] "1.8.0_261-b12"
$`1.8.0_261`$MSI$INSTALLDIR
[1] "C:\\Program Files\\Java\\jre1.8.0_261\\"
$`1.8.0_261`$MSI$JAVAUPDATE
[1] "1"
$`1.8.0_261`$MSI$JU
[1] ""
$`1.8.0_261`$MSI$OEMUPDATE
[1] ""
$`1.8.0_261`$MSI$PRODUCTVERSION
[1] "8.0.2610.12"
这是很多输出,但我们仍然可以看到当前的 Java 版本是 1.8,JavaHome
设置是C:\\Program Files\\Java\\jre1.8.0_261
. 由于注册表树相对复杂,因此需要相当多的知识来编写正确的键以减少返回的输出量。
# more specific extract, given that $CurrentVersion is 1.8
readRegistry("SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.8","HLM",maxdepth=3)
...返回一组更有针对性的注册表设置。
> readRegistry("SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.8","HLM",maxdepth=3)
$JavaHome
[1] "C:\\Program Files\\Java\\jre1.8.0_261"
$MicroVersion
[1] "0"
$RuntimeLib
[1] "C:\\Program Files\\Java\\jre1.8.0_261\\bin\\server\\jvm.dll"
Java/R 与非英文版 Windows 10 的兼容性
请注意,截至 2020 年 7 月,Stackoverflow.com上的用户报告了在 Windows 版本为非英语语言版本(例如中文、波兰语等)的情况下安装 Java 和 rJava 的问题。Java 安装程序与这些版本的 Windows、R 和rJava
软件包一起工作的方式似乎无法JAVA_HOME
正确访问该目录。
要更正此问题,请使用 Windows 使用的相同语言重新安装 R。即在中文版Windows上,安装支持中文的R。language = "en"
安装后,您可以通过在.Rconsole
文件中设置将语言更改为英语。
参考: 常见问题:Java 和 xlsx 包,最初由我于 2017 年 1 月在我的约翰霍普金斯大学数据科学专业化社区导师库上发布。