我正在尝试从Matlab中运行一个R脚本,我得到了 和这张海报一样的错误: Calling R from Matlab
据我所知,情况是一样的,除了我的情况 系统正在运行LinuxMint(发布14 Nadia,内核 3.5.0-17-通用)并且该帖子中的解决方案不起作用 我。任何人都可以提出进一步的建议吗?我很难过。
就像上面帖子中的海报一样,我的调用是从shell开始的,但不是来自matlab。
r_script.R包含:
foo <- rnorm( 100 )
cat( sd( foo ), '\n' )
cat( mean( foo ), '\n' )
我在Matlab中得到的错误消息:
>> system( 'Rscript /tmp/r_script.R' )
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib/R/library/stats/libs/stats.so':
/usr/local/MATLAB/R2013a/sys/os/glnxa64/libgfortran.so.3: version `GFORTRAN_1.4' not found (required by /usr/lib/liblapack.so.3)
During startup - Warning message:
package ‘stats’ in options("defaultPackages") was not found
Error: could not find function "rnorm"
Execution halted
ans =
1
>> !unset DYLD_LIBRARY_PATH;
>> system( 'Rscript /tmp/r_script.R' )
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib/R/library/stats/libs/stats.so':
/usr/local/MATLAB/R2013a/sys/os/glnxa64/libgfortran.so.3: version `GFORTRAN_1.4' not found (required by /usr/lib/liblapack.so.3)
During startup - Warning message:
package ‘stats’ in options("defaultPackages") was not found
Error: could not find function "rnorm"
Execution halted
ans =
1
答案 0 :(得分:4)
好吧,Amro和DWin的回答让我指出了正确的方向,我已经解决了问题。问题是Matlab似乎包含了自己的libgfortran.so.3版本,与我系统上的版本相比,它必须是过时的(并且由R预期)。非常感谢Amro和DWin帮助我。
对于后来出现的任何可怜的灵魂:
我能够通过在Matlab的内部和外部运行/usr/lib/R/library/stats/libs/stats.so上的ldd来确定这一点。
!ldd /usr/lib/R/library/stats/libs/stats.so(来自Matlab内部)返回:
<snip>
libgfortran.so.3 => /usr/local/MATLAB/R2013a/sys/os/glnxa64/libgfortran.so.3 (0x00007faff0bbc000)
</snip>
和ldd /usr/lib/R/library/stats/libs/stats.so(来自shell)返回:
<snip>
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f3c9b308000)
</snip>
将系统libgfortran.so.3添加到Matlab的LD_LIBRARY_PATH(不是结尾)的开头解决了这个问题。来自Matlab内部:
>> setenv( 'LD_LIBRARY_PATH', strcat( '/usr/lib/x86_64-linux-gnu:', getenv( 'LD_LIBRARY_PATH' ) ) )
>> !/usr/bin/Rscript /tmp/r_script.R
0.8317391
0.09262757
答案 1 :(得分:1)
这可能是由MATLAB和R使用的库之间的版本不匹配引起的。您可以使用LD_PRELOAD
来解决这个问题。在MATLAB内部和外部使用ldd
来找出导致问题的原因......
在MATLAB中:
>> !ldd Rscript
在shell中:
$ ldd Rscript
顺便说一句Linux等同于现有的解决方案:
>> !unset LD_LIBRARY_PATH
>> system('...')
所以先尝试一下..
(请注意,我在Windows计算机上,因此未对任何解决方案进行测试)