2016-08-06 7 views
1

私はrpy2で作業しています.Rオブジェクトで代入メソッドを使用する必要があります。たとえば、このオブジェクトで始まる:rの割り当て方法をrpy2で使う方法は?

# Python code 
from rpy2.robjects import r 
myvar = r('c(a=1,b=2,c=3)') 

は、私がnames(myvar)に割り当てるとします。 (注意:rpy2はmyvar.names経由名にアクセスするための別の方法を提供しているという事実を無視します。これは、名前だけではなく、任意の割り当て方法のために働く。。)Rで、私はどうなる:

# R code 
names(myvar) <- c("x", "y", "z") 

ただし、これはしませんPythonでの作業:もちろん

# Python code 
> names(myvar) = ['x', 'y', 'z'] 
In [62]: names(myvar) = ['x', 'y', 'z'] 
    File "<ipython-input-62-aa3f7998cdcb>", line 1 
    names(myvar) = ['x', 'y', 'z'] 
           ^
SyntaxError: can't assign to function call 

、私はrpy2の文字列evalを介して、任意のコードを実行することができます。

# Python code 
r('''names(myvar) <- c("x", "y", "z")''') 

が、評価される文字列に値を補間することは鳴りません楽しく安全です。だから、安全にmethod(object) <- valueのrpy2に相当することをする方法はありますか?

答えて

3

Rでは、「セッター」関数は、「ゲッター」の後に<-が続く名前付け規則に従います。たとえば、次のように起こっている

names(myvar) <- c("x", "y", "z") 

を行うとき:

myvar <- "names<-"(myvar, c("x","y","z")) 

を、我々はそれを打破した場合:

> myvar = c(a=1,b=2,c=3) 
> # call the assignment function "names<-"  
> "names<-"(myvar, c("x","y","z")) 
x y z 
1 2 3 
> # the "names" are stored as an attribute 
> attributes(myvar) 
$names 
[1] "x" "y" "z" 
> attributes(myvar)$names <- c("a","b","c") 
> myvar 
a b c 
1 2 3 
> # note that the function does have a side effect 
> # (unlike what I wrote in a previous version of this answer): 
> # the names are changed in place. I think that this is a C-level 
> # optimization specific to "names" and this may not always be 
> # the case for all "setters" 
> "names<-"(myvar, c("x","y","z")) 
x y z 
1 2 3 
> myvar 
x y z 
1 2 3 

rpy2からmethod(object) <- valueような何かを行うことは簡単です。 Rの基本パッケージのインポートを検討し、直接Rの統計パッケージをインポートし、直接setNames()機能を使用c()機能を使用して名前を割り当てること

set_method = r("`method<-`") 
my_object = set_method(my_object, value) 
1

:Pythonのコードは次のように見ています。以下r()base.c()収率同等の値で割り当てる方法を示しています。

from rpy2.robjects import r 
from rpy2.robjects.packages import importr 

base = importr('base') 

myvar1 = r("c('x','y','z')") 
myvar2 = base.c('x', 'y', 'z') 

# SAME CLASS TYPE 
print(type(myvar1)) 
# <class 'rpy2.robjects.vectors.StrVector'> 
print(type(myvar2)) 
# <class 'rpy2.robjects.vectors.StrVector'> 

from rpy2.robjects import pandas2ri 
pandas2ri.activate() 

# CONVERT TO PYTHON NUMPY ARRAY 
py_myvar1 = pandas2ri.ri2py(myvar1) 
py_myvar2 = pandas2ri.ri2py(myvar2) 

print(py_myvar1==py_myvar2) 
# [ True True True] 

print(py_myvar1) 
# ['x' 'y' 'z'] 
print(py_myvar2) 
# ['x' 'y' 'z'] 

と名前と値の出力ベクトルを持つ名割り当てる:要するに

stats = importr('stats') 
# EQUIVALENT TO R: myvar <- setNames(c('a', 'b', 'c'), c(1,2,3)) 
myvar3 = stats.setNames(base.c(1,2,3), base.c('a', 'b', 'c')) 

print(type(myvar3)) 
# <class 'rpy2.robjects.vectors.IntVector'> 

# NAME VECTOR 
py_myvar3 = pandas2ri.ri2py(base.names(myvar3)) 
print(py_myvar3) 
# ['a' 'b' 'c'] 

# VALUES VECTOR 
py_myvar3 = pandas2ri.ri2py(myvar3) 
print(py_myvar3) 
# [1 2 3] 

を、Pythonは関数は値を割り当てることが呼び出しを許可しません。オブジェクトを作成し、右側の値をPythonの規則に合わせて割り当てる適切なメソッドを見つけてください。

+0

これは名前に対しては機能しますが、任意のセッター関数では機能しません。 'names < - '以外のセッターを含む簡単な例を考えることができたらと思います。 –

関連する問題