2010-07-21 56 views
4

我在理解與rpy2對象和python對象的映射時遇到了一些麻煩。使用rpy2映射python元組和R列表?

我有一個函數(x)返回一個元組對象在Python中,我想映射這個元組對象與R對象列表或向量。

首先,我試圖做到這一點:

# return a python tuple into this r object tlist 
robjects.r.tlist = get_max_ticks(x) 

#Convert list into dataframe 
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))') 

失敗,錯誤: rinterface.RRuntimeError:錯誤的eval(表達式,ENVIR,enclos): 'TLIST' 未找到

對象

所以我想的其他策略:

robjects.r["tlist"] = get_max_ticks(x) 
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))') 

失敗,出現此錯誤: TypeError:'R'對象不支持項目分配

你能幫我理解嗎? 非常感謝!

回答

3

使用globalEnv

import rpy2.robjects as ro 
r=ro.r 

def get_max_ticks(): 
    return (1,2) 
ro.globalEnv['tlist'] = ro.FloatVector(get_max_ticks()) 
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))') 
print(r['x']) 
#  tlist 
# seed  1 
# ticks  2 

它可能會訪問符號的R命名空間這種類型的表示法:robjects.r.tlist,但你不能賦值這種方式。分配符號的方法是使用robject.globalEnv

此外,R中的某些符號可能包含句點,例如data.frame。您不能在Python中使用類似於robjects.r.data.frame的符號訪問這些符號,因爲Python解釋的週期與R不同。所以我建議完全避免這種表示法,而是使用 robjects.r['data.frame'],因爲無論符號名是什麼,這個表示法都可以工作。

+1

這種表示法是不是既安全,因爲做這樣的事情「ro.globalEnv [‘data.frame’] = ro.r(「功能(x)NULL')「之前的某處會導致問題。 我推薦使用類DataFrame。 – lgautier 2010-07-21 19:18:20

+0

Thx @〜unutbu,thx @lgautier在這裏和在mailling list上的回覆,現在我試圖理解data.frame對象在手冊中的示例 – reyman64 2010-07-23 12:20:41

0

您也可避免在R上的分配都在一起:

import rpy2.robjects as ro 
tlist = ro.FloatVector((1,2)) 
keyWordArgs = {'row.names':ro.StrVector(("seed","ticks"))} 
x = ro.r['as.data.frame'](tlist,**keyWordArgs) 
ro.r['print'](x)