tl;dr -如何修复AttributeError: 'ListSexpVector' object has no attribute 'items'
下面是完整的代码。rpy2
的导入对您来说可能略有不同:
import os
os.environ['R_HOME'] = "/Library/Frameworks/R.framework/Resources"
import rpy2
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri, r, numpy2ri
from rpy2.robjects.conversion import localconverter
pandas2ri.activate()
numpy2ri.activate()
然后创建一个测试数据框架。
import pandas as pd
data = {'status': ['treatment','treatment','control','control'],
'result': [20,21,19,18]}
df = pd.DataFrame(data)
然后我运行第一个测试代码,它工作了。
with localconverter(ro.default_converter + pandas2ri.converter + numpy2ri.converter):
r.assign("pydf", df)
hellow_world = r("""
summary(pydf)
""")
print(hellow_world)
我得到正确的R打印出来。哇。:)
但是当我尝试做我真正想做的事情时:
with localconverter(ro.default_converter + pandas2ri.converter + numpy2ri.converter):
r.assign("pydf", df)
hellow_world = r("""
t.test(result ~ status, data = pydf)
""")
print(hellow_world)
我得到以下错误:
AttributeError: 'ListSexpVector' object has no attribute 'items'
这似乎与rpy2py
方法有关,但关于如何修复的任何想法都将非常感谢!
谢谢。主总是拯救我们!
我想你在numpy2ri
子模块中遇到了一个bug。你遇到的问题是,本地转换器认为hellow_world
是ListSexpVector
,但它似乎是StrSexpVector
对象,而不是(基于我的快速调试)。我对numpy2ri
模块还不太了解,无法确切地知道这是如何发生的,但这里有一个解决方案:
如果你只想打印R消息
r.assign("pydf", df)
hellow_world = r("""
t.test(result ~ status, data = pydf)
""")
print(hellow_world)
你根本不需要转换器。
如果你想用Python解析R消息
r.assign("pydf", df)
hellow_world = r("""
t.test(result ~ status, data = pydf)
""")
with localconverter(ro.default_converter + pandas2ri.converter + numpy2ri.converter):
print(list(hellow_world))
如果没有localconverter
上下文,hellow_world = r(...
行返回一个原始R对象,而不会触发错误的转换。然后,在转换上下文中将hellow_world
转换为Python列表将触发函数式的逐列表项转换。生成的列表阅读起来要困难得多,但它是一个带有str和numpy对象的Python列表。