【问题标题】:how to correctly get R sessionInfo() from python script with rpy2 api?如何使用 rpy2 api 从 python 脚本中正确获取 R sessionInfo()?
【发布时间】:2020-08-03 03:38:01
【问题描述】:

我试图通过在 python 脚本中使用rpy2 来获取 R sessioninfo(),原因是我要从 python 调用 api 到自定义 R 库。我想尝试的基本方法是使用简单的 python 脚本获取当前的 R sessioninfo()。

我的尝试

这是我按照SO post 尝试的尝试:

import rpy2.robjects as robjects
import os

os.environ['R_HOME'] = "C:/PROGRA~1/R/R-36~1.3"
robjects.r('''
       source('myfunc.r')
''')

myfunc = function(){
  return(sessionInfo())
}

我通过在 R 工作室中使用 Sys.getenv('R_HOME')R.home() 获得了 R_HOME。

新的更新尝试

根据@Parfait 的建议,我也尝试过这种方式:

pip install .\rpy2-2.9.5-cp37-cp37m-win_amd64.whl

import os
os.environ['PYTHONHOME'] = r"C:\Users\mia\AppData\Local\Programs\Python\Python37"
os.environ['PYTHONPATH'] = r'C:\Users\mia\AppData\Local\Programs\Python\Python37\Lib\site-packages'
os.environ['R_HOME'] = r'C:\Program Files\R\R-3.6.3'
os.environ['R_USER'] = r'C:\Users\mia\AppData\Local\Programs\Python\Python37\Lib\site-packages\rpy2'

# importing rpy2
import rpy2
import rpy2.robjects as robjects

# test : evaluating R code
robjects.r('''
        # create a function `f`
        f <- function(r, verbose=FALSE) {
            if (verbose) {
                cat("I am calling f().\n")
            }
            2 * pi * r
        }
        ''')

r_f = robjects.r['f']
res = r_f(3)
print(res[0])

但现在我得到另一个错误:

>     ---------------------------------------------------------------
>         OSError                       Traceback (most recent call last)
>         <ipython-input-27-b5597ba1add5> in <module>
>               1 import rpy2
>         ----> 2 import rpy2.robjects as robjects
>               3 import itertools
>               4 from datetime import datetime
>               5 import rpy2.rinterface as rinterface
>         
>         c:\users\mia\appdata\local\programs\python\python37\lib\site-packages\rpy2\robjects\__init__.py
> in <module>
>              14 import itertools
>              15 from datetime import datetime
>         ---> 16 import rpy2.rinterface as rinterface
>              17 import rpy2.rlike.container as rlc
>              18 
>         
>         c:\users\mia\appdata\local\programs\python\python37\lib\site-packages\rpy2\rinterface\__init__.py
> in <module>
>              44 
>              45 if sys.platform == 'win32':
>         ---> 46     _load_r_dll(R_HOME)
>              47 
>              48 # cleanup the namespace
>         
>         c:\users\mia\appdata\local\programs\python\python37\lib\site-packages\rpy2\rinterface\__init__.py
> in _load_r_dll(r_home)
>              28     if r_bin not in os.environ.get('PATH'):
>              29         os.environ['PATH'] = ';'.join((os.environ.get('PATH'), r_bin, r_mod))
>         ---> 30     ctypes.CDLL(r_dll)
>              31 
>              32 R_HOME = get_r_home()
>         
>         c:\users\mia\appdata\local\programs\python\python37\lib\ctypes\__init__.py
> in __init__(self, name, mode, handle, use_errno, use_last_error)
>             362 
>             363         if handle is None:
>         --> 364             self._handle = _dlopen(self._name, mode)
>             365         else:
>             366             self._handle = handle
>         
>         OSError: [WinError 126] The specified module could not be found

现在我可以导入rpy2 也可以导入rpy2.robjects,但无法正确获取R sessionInfo()。有什么进一步的想法吗?谢谢

想要的输出

我只想使用rpy2 在 jupyternotebook 或 python 脚本中打印出 R sessionInfo()?有什么解决方案可以做到这一点?有什么想法吗?非常感谢

【问题讨论】:

  • @Parfait 感谢您的提醒。我将如何使用 R_USER ?你能告诉我如何使用python脚本获取sessionInfo()吗?您介意详细说明您的可行解决方案吗?谢谢
  • @Parfait 你是说用这个:R_USER = os.getenv("R_USER")?它不起作用,你能看看我上面的更新尝试吗?
  • @Parfait 我可以导入rpy2,但不能导入rpy2.robjects 导致操作系统错误?你有什么可能的帮助吗?
  • @Parfait 是的,我试过pip install rpy2-2.9.5-cp37-cp37m-win_amd64.whl,设置R_USER = r"C:\Users\mia\AppData\Local\Programs\Python\Python37\Lib\site-packages\rpy2",但仍然无法获得R sessionInfo()?你有什么解决方案吗?谢谢
  • 是你原来的安装还是按照我的建议刚刚安装的?您应该在新安装之前删除任何以前的版本。您是否收到与发布的完全相同的错误?

标签: python r rpy2


【解决方案1】:

我在我的 windows 机器上遇到了同样的问题,你遇到这个问题是因为你没有将 R 安装路径添加到系统变量中。您应该执行以下操作:

打开Control Panel\System and Security\System,打开Environment Variables,找到System Variables,然后选择PathC:\Program Files\R\R-3.3.2\bin\x64 添加到您的系统变量中。确保从uci website 安装rpy2,然后下载rpy2.whl 然后pip install rpy2.xx.xx.whl

然后在你的 python 脚本中做这个设置:

import os


os.environ['PYTHONHOME'] = r"C:\Users\me\AppData\Local\Programs\Python\Python37"
os.environ['PYTHONPATH'] = r"C:\Users\me\AppData\Local\Programs\Python\Python37\Lib\site-packages"
os.environ['R_HOME'] = r"C:\Program Files\R\R-3.3.2"
os.environ['R_USER'] = r"C:\Users\me\AppData\Local\Programs\Python\Python37\Lib\site-packages\rpy2"

import rpy2
import rpy2.robjects as robjects

pi = robjects.r['pi']
print(pi)

这个问题可以立即解决您的问题。

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 2019-09-14
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2013-04-13
    • 2017-03-24
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多