Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >升级到OSX Yosemite后,RStudio/R中的rJava加载错误

升级到OSX Yosemite后,RStudio/R中的rJava加载错误
EN

Stack Overflow用户
提问于 2015-06-09 17:33:28
回答 18查看 80.2K关注 0票数 124

我最近从OSX Mountain Lion升级到Yosemite,从R 3.1.3升级到3.2。升级后,当我打开R或RStudio时,我收到一条弹出消息,告诉我需要安装Java6。此外,加载rJava或任何依赖于rJava的包(例如,xlsx)会导致RStudio崩溃(当我直接打开R.app尝试执行此操作时,R也会崩溃)。

在尝试了在堆栈溢出和其他地方找到的一些修复程序(下面有更多详细信息)之后,我发现加载rJava或任何依赖于rJava的包不再导致R崩溃,但会导致以下错误:

代码语言:javascript
运行
AI代码解释
复制
library(rJava)
Error : .onLoad failed in loadNamespace() for 'rJava', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so':
  dlopen(/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: @rpath/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so
  Reason: image not found
Error: package or namespace load failed for ‘rJava’

但是,如果我从命令行调用R,然后加载rJava或任何依赖于rJava的包,它似乎可以工作(或者至少我没有得到任何错误消息)。

我尝试了许多不同的修复,其中一些尝试了几次,但我不太记得我是按什么顺序做的(我没有意识到这会是一片沼泽,也没有真正跟踪),但这里是它的要点:

  • 在我的.bash_profile中添加了以下内容(根据this SO answer):

导出JAVA_HOME="/usr/libexec/java_home -v 1.8“

导出LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/server

从命令行执行

  • Reconfigured java命令,如下所示:

sudo R CMD javareconf -n

  • 检查了options("java.home"),发现它被设置为NULL。我尝试将其设置为以下内容(根据this SO question):

options("java.home"="/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre")

  • 安装了最新的Java开发工具包,并从源代码重新安装了rJava (不记得在哪里找到的)。

在尝试所有这些方法时,我可以在不崩溃R的情况下加载rJava,但却得到了上面发布的错误消息。此外,当我退出RStudio时,它似乎正常关闭,但随后会弹出"RStudio意外退出“消息,指示程序在尝试关闭时崩溃。

我最终决定安装Java for OS X 2014-001 (Java6),因为我似乎已经没有选择了。现在,当我打开R或RStudio时,弹出消息“该软件需要Java6”不再出现。但是,我仍然收到上面发布的.onLoad failed in loadNamespace() for 'rJava'错误消息。

在回顾我已经看过的一些帖子时,我注意到了我以前错过的another SO answer,它建议使用以下命令行代码打开RStudio,该代码为RStudio提供了正确的java路径:

打开LD_LIBRARY_PATH=$(/usr/libexec/java_home)/jre/lib/server:

-a RStudio

这打开了一个RStudio窗口,我还可以加载rJava和依赖它的包,而不会出现错误。

最后,我尝试从命令行运行R(这是我以前没有做过的)。事实证明,在命令行上,加载rJava或任何依赖于rJava的包都是有效的,并且不会抛出任何错误。

因此,如果我从命令行打开rJava,并使用为RStudio提供java路径的代码(如上所述),我现在就可以让RStudio工作了。然而,我想找到一种方法来修复潜在的问题,无论它可能是什么,这样RStudio就可以以通常的Mac方式打开,而不需要命令行的繁琐。我还担心安装旧版本的Java可能会带来问题。

有没有人知道如何诊断和解决这个问题?

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2015-06-24 23:57:39

我也有同样的问题,也经历了和你一样的步骤。允许通过Finder/Spotlight启动RStudio的最后一步是将libjvm.dylib链接到/usr/local/lib:

代码语言:javascript
运行
AI代码解释
复制
sudo ln -f -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib

添加-f标志以强制覆盖现有文件/链接

票数 280
EN

Stack Overflow用户

发布于 2015-10-20 17:43:36

在OSX El Capitan 10.11上,用户没有写入/usr/lib的权限。因此,请改用以下命令:

代码语言:javascript
运行
AI代码解释
复制
sudo ln -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib
票数 53
EN

Stack Overflow用户

发布于 2015-12-28 06:55:54

您可以显式地加载libjvm.dylib,如下所示

代码语言:javascript
运行
AI代码解释
复制
dyn.load('/Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/jre/lib/server/libjvm.dylib')
library(rJava)
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30738974

复制
相关文章
C++带参数的构造函数 | 有参构造函数
在C++中,程序员希望对不同的对象赋予不同的初值,可以采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数, 以实现不同的初始化。
小林C语言
2021/01/28
4.1K0
C++带参数的构造函数 | 有参构造函数
C++转换构造函数与类型转换构造函数
转换构造函数:  转换构造函数的只有一个形参: 1 Student(float s) 2 { 3 score = s; 4 age = 0; 5 }  如果已经在上面定义了构造函数: 1 Student(85); //建立对象c1,由于只有一个参数,调用转换构造函数 如果对“+”进行了重载,那么以下是编译错误的: 1 stu2 = stu1 + 85; //这样编译错误 2 stu2 = stu1 + Student(85); //合法,将85转换为
233333
2018/03/07
1.9K0
C++构造函数 | 构造函数
C++在建立一个对象时,常常需要作某些初始化,如果一个数据成员未被赋值,则它的值是不可预知的,因为在系统为它分配内存时,保留了这些存储单元的原状,这就成为了这些数据成员的初始值,在C++中,对象是一个实体,它反映了客观事物的属性,是应该有确定的值的。
小林C语言
2021/01/26
2.2K0
C++构造函数 | 构造函数
java scanner构造函数_使用Scanner作为构造函数的参数的Java
这是一个学校任务的问题,这就是为什么我这样做的原因。使用Scanner作为构造函数的参数的Java
用户7886150
2021/04/26
2.9K0
【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )
1 . 讨论问题 : 本章只针对一点进行讨论 , 那就是对两种类型的参数修改 , 是否影响到外部的变量 ; 传入什么样的参数才能修改外部变量 , 即 参数当返回值使用 ;
韩曙亮
2023/03/27
2.2K0
C++构造函数的作用_c++什么是构造函数
就是构造函数的作用可以这样理解,如果没有构造函数就是类里边只是声明了成员变量,成员函数,还有最后的对象,这样你在对该对象进行初始化赋值时就比较麻烦就得先调用成员函数对成员变量赋值,成员变量进而作用到对象上,之后有了构造函数,在构建构造函数时直接可以带参数对对象进行初始化,相当于省略了步骤,可以这样简单的理解。
全栈程序员站长
2022/10/29
1.5K0
C++的构造函数
很多时候我们希望在创建一个类对象的同时能够给它的数据成员赋初值,因为类的数据成员是不能在声明的时候赋初值的,所以一种方法是可以通过定义成员函数来给数据成员赋初值,但有时候我们可能会忘记去调用这个函数,因此能不能建立一种机制,让系统自动调用赋初值的函数呢?
叶茂林
2023/07/30
1810
小朋友学C++(9):构造函数的默认参数
构造函数可以预先赋一个初值,其作用是:在构造函数被调用时,省略部分或全部参数,这时就会使用默认参数代替实参。 程序: #include <iostream> using namespace std; class Rectangle { private: int width; int height; public: Rectangle(int w = 0, int h = 0) { cout << "Constructor method is invoked!
海天一树
2018/04/17
1.1K0
C++ 构造函数的运用,继承、派生时的重载方式
c++在进行实例化的时候通常需要使用构造函数,没有显示构造函数的时候,系统会默认一个所有参数为空的默认构造函数。
雪碧君
2023/02/15
7340
C++ 中为什么需要虚函数
我最近正在学习 C++ 的虚函数,我知道虚函数是用于子类继承的,但虚函数什么时候才需要用它?因为我发现有的教科书上有用 virtual,有的又不用,我有点搞混了。
ClearSeve
2022/02/10
8860
【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )
无参构造函数 : 只负责为指针类型的成员变量分配内存 , 并赋值一个初始值 , 没有具体的赋值信息 , 该初始化只能为 成员变量 赋值一个默认值 ;
韩曙亮
2023/10/15
5120
【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )
C++的移动构造函数
C++的移动构造函数是一种特殊的构造函数,用于将资源从一个对象转移到另一个对象而不进行深拷贝。移动构造函数通常用于支持移动语义,以提高代码的效率和性能。
叶茂林
2023/07/30
7440
Aop动态生成代理类时支持带参数构造函数
  在某些情况下,我们需要植入AOP代码的类并没有默认构造函数。那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数。自己折腾了1晚上没搞定,现在搞定了发出来供大家一起学习探讨。
Zachary_ZF
2018/09/10
1.2K0
Aop动态生成代理类时支持带参数构造函数
C++ explicit禁止单参数构造函数隐式调用
C++中单参数构造函数是可以被隐式调用的,主要有两种情形会隐式调用单参数构造函数: (1)同类型对象的拷贝构造;即用相同类型的其它对象来初始化当前对象。 (2)不同类型对象的隐式转换。即其它类型对象隐式调用单参数拷贝构造函数初始化当前对象。比如A a=1;就是隐式转换,而不是显示调用构造函数,即A a(1);。像A(1)这种涉及类型转换的单参数构造函数,又被称为转换构造函数(Converting Constructor)。
恋喵大鲤鱼
2018/09/27
4.8K1
mybatis文件映射之当输入的参数不只一个时
2、多个参数:mybatis遇见多个参数会进行特殊处理,多个参数会被封装成员一个map,#{}就是从Map中获取指定的key的值。
西西嘛呦
2020/08/26
4780
C++拷贝构造函数
     拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。 调用拷贝构造函数的情形 在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”): 1) 一个对象作为函数参数,以值传递的方式传入函数体; 2) 一个对象作为函数返回值
猿人谷
2018/01/17
2K0
C++拷贝构造函数
c++拷贝构造函数
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:
全栈程序员站长
2021/09/30
1.1K0
c++拷贝构造函数
C++拷贝构造函数
假定有类T 则下列情况调用的函数是不一样的: T a = b; a=b; 第一种情况调用的是拷贝构造函数 第二种情况调用的是赋值运算符。 默认的拷贝构造函数执行的是浅拷贝,在对象涉及到动态分配的存储空间时,会出现问题。 在a中修改变量值后,b中的也发生改变。 出现内存泄漏(只new但是没有delete就会出现这样的问题) 一个地址被多次释放也会出错 要解决上面的问题,就要执行深拷贝 深拷贝使得每一个对象成员都有自己的内存空间。 要执行深拷贝,那么就要自己定义拷贝构造函数。 主要操作在于,对于动态分配的空间,
灯珑LoGin
2022/10/31
6000
C++构造函数语义(合成默认构造函数)
       在初学C++的时候,对于一个对象来说,如果我们没有去定义其默认构造函数,那么编译器就会为我们自动生成一个默认构造函数。但其实是不准确的,具体来说是编译器会在必要的时候来生成一个默认构造函数,那么这个编译器生成的默认构造函数称为合成默认构造函数。那么在以下四种情况中编译器才会生成一个合成默认构造函数:
Ch_Zaqdt
2020/03/09
1.4K0
点击加载更多

相似问题

为什么需要空构造函数?

21

为什么在映射中存储时需要默认构造函数?

40

C++:没有调用的匹配函数:为什么需要空构造函数?

14

为什么在使用构造函数时需要赋值为空值?Java

10

为什么C++构造函数在继承中需要默认参数?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文