如何在完成一些特定于 R 的计算后将向量从 Python 传输到 R(并返回)
How to transfer a vector from Python to R (and back) after having done some R specific computations
假设我在 python 环境中有一个向量 x1
作为 numpy 数组。我想将该向量转移到 R 环境,使用 R 特定函数进行一些计算,然后得到另一个向量 x2
,然后想将 x2
作为 numpy 数组转移回 python。目标是获得以下输出:
[1 2 3]
[2 2 3]
这是使用 rpy2(或任何其他包)的代码(在第 9 行之前有效,但之后无效)?
from rpy2.robjects import FloatVector
from rpy2.robjects.packages import importr
stats = importr('stats')
base = importr('base')
#lmtest = importr("lmtest")
import rpy2.robjects as robjects
import numpy as np
x1 = np.array([1,2,3])
print(x1)
robjects.r('''
x2 = x1
x2[1] = x2[1] + 1 ## some R specific function
''')
print(x2)
编辑
我尝试实现@lgautier 的答案如下:
import rpy2.robjects as robjects
import numpy as np
x1 = np.array([1,2,3])
print(x1)
robjects.r('''
x2 = x1
x2[1] = x2[1] + 1 ## some R specific function
''')
x3 = robjects.r['x2']
但我收到以下错误消息
R[write to console]: Error in (function (expr, envir = parent.frame(), enclos = if (is.list(envir) || :
object 'x1' not found
我做错了什么?
这里有一个选项pyper
from pyper import *
import numpy as np
x1 = np.array([1,2,3])
r = R(use_pandas=True)
r.assign('x1', x1)
expr1 = '''x2 = x1;
x2[1] = x2[1] + 1;
x2'''
r(expr1)
r.get('x2')
-在 python
上测试
>>> from pyper import *
>>> import numpy as np
>>> x1 = np.array([1,2,3])
>>> r = R(use_pandas=True)
>>> r.assign('x1', x1)
>>> expr1 = '''x2 = x1;
x2[1] = x2[1] + 1;
x2'''
>>> r(expr1)
'try({x2 = x1;\n+ x2[1] = x2[1] + 1;\n+ x2})\n[1] 2 2 3\n'
>>> r.get('x2')
array([2, 2, 3])
>>>
在代码的以下部分中,您声明了一个 Python 变量 x1
并为其分配了一个 numpy 数组。在您创建一个 R 变量(可选地使用相同的名称)之前,R 不会知道它。
x1 = np.array([1,2,3])
# Python knows about x1, you defined it right above.
print(x1)
# R does not know any x1 unless you have defined it before.
robjects.r('''
x2 = x1
x2[1] = x2[1] + 1 ## some R specific function
''')
要在 R 全局环境中定义 x1
,尝试:
robjects.globalenv['x1'] = 123
文档中的介绍在这里涵盖了这一点:https://rpy2.github.io/doc/latest/html/introduction.html#the-r-instance
除此之外,从 numpy
数组转换到 numpy
数组需要使用转换器。 rpy2
可以使用或不使用 numpy
。文档在这里:https://rpy2.github.io/doc/latest/html/numpy.html
假设我在 python 环境中有一个向量 x1
作为 numpy 数组。我想将该向量转移到 R 环境,使用 R 特定函数进行一些计算,然后得到另一个向量 x2
,然后想将 x2
作为 numpy 数组转移回 python。目标是获得以下输出:
[1 2 3]
[2 2 3]
这是使用 rpy2(或任何其他包)的代码(在第 9 行之前有效,但之后无效)?
from rpy2.robjects import FloatVector
from rpy2.robjects.packages import importr
stats = importr('stats')
base = importr('base')
#lmtest = importr("lmtest")
import rpy2.robjects as robjects
import numpy as np
x1 = np.array([1,2,3])
print(x1)
robjects.r('''
x2 = x1
x2[1] = x2[1] + 1 ## some R specific function
''')
print(x2)
编辑
我尝试实现@lgautier 的答案如下:
import rpy2.robjects as robjects
import numpy as np
x1 = np.array([1,2,3])
print(x1)
robjects.r('''
x2 = x1
x2[1] = x2[1] + 1 ## some R specific function
''')
x3 = robjects.r['x2']
但我收到以下错误消息
R[write to console]: Error in (function (expr, envir = parent.frame(), enclos = if (is.list(envir) || :
object 'x1' not found
我做错了什么?
这里有一个选项pyper
from pyper import *
import numpy as np
x1 = np.array([1,2,3])
r = R(use_pandas=True)
r.assign('x1', x1)
expr1 = '''x2 = x1;
x2[1] = x2[1] + 1;
x2'''
r(expr1)
r.get('x2')
-在 python
上测试>>> from pyper import *
>>> import numpy as np
>>> x1 = np.array([1,2,3])
>>> r = R(use_pandas=True)
>>> r.assign('x1', x1)
>>> expr1 = '''x2 = x1;
x2[1] = x2[1] + 1;
x2'''
>>> r(expr1)
'try({x2 = x1;\n+ x2[1] = x2[1] + 1;\n+ x2})\n[1] 2 2 3\n'
>>> r.get('x2')
array([2, 2, 3])
>>>
在代码的以下部分中,您声明了一个 Python 变量 x1
并为其分配了一个 numpy 数组。在您创建一个 R 变量(可选地使用相同的名称)之前,R 不会知道它。
x1 = np.array([1,2,3])
# Python knows about x1, you defined it right above.
print(x1)
# R does not know any x1 unless you have defined it before.
robjects.r('''
x2 = x1
x2[1] = x2[1] + 1 ## some R specific function
''')
要在 R 全局环境中定义 x1
,尝试:
robjects.globalenv['x1'] = 123
文档中的介绍在这里涵盖了这一点:https://rpy2.github.io/doc/latest/html/introduction.html#the-r-instance
除此之外,从 numpy
数组转换到 numpy
数组需要使用转换器。 rpy2
可以使用或不使用 numpy
。文档在这里:https://rpy2.github.io/doc/latest/html/numpy.html