2016-11-04 5 views
0

私はPythonからRコードを呼び出すためにrpy2を試していました。いくつかのコードを試してみたところ、rpy2.robjects.r()のR関数([]の代わりに()の通知、私はrと呼んでいます)を定義できます。このように定義された関数は、rpy2.robjects.rrpy2.robjects.globalenvの両方で索引付けできます。しかし、これはpiの場合には当てはまりません。私はrpy2.robjects.r['pi']を行うことができますが、私はrpy2.robjects.globalenv['pi']を行うことはできません。`rpy2.robjects.r`と` rpy2.robjects.globalenv`の相違点

robjects.r(""" 
    f <- function(){ 
     print("Hello World!!!") 
    } 
""") 

#function f is defined using rpy2.robjects.r() and can be 
#accessed using rpy2.robjects.globalenv[] 
#(as well as using rpy2.robjects.r[]) 

f = robjects.globalenv["f"] 
print(f())  #Hello World!!! 

#pi which can be accessed as rpy2.robjects.r[] cannot be 
#accessed as rpy2.robjects.globalenv[] 

print(robjects.r['pi'])    #3.141593 
print(robjects.globalenv['pi'])  #Error: object 'pi' not found 

それがそうであるのはなぜ?

答えて

1

rpy2オブジェクトrは、埋め込み状態で実行されている「R」を表します。コールに文字列(例:r("1+2"))を渡すと、その文字列はRコードとして評価され、出力が返されます。

一方、globalenvはR "環境" .Globalenvです。これは基本的に、R端末でオブジェクトを宣言したときにオブジェクトが移動する場所です。 Rコードは、これを明確にすることがあります。

x <- 1 
# get "x" back, the less-easy way 
get("x", .GlobalEnv) 

Rコンソールでpiを行う場合、シンボルは.GlobalEnvで最初に検索し、「検索パス」(ロードされたライブラリ)の残りの部分を見つけていない場合されます検索されます。 piはIIRCの "base" Rパッケージに含まれています。

pi # returns 3.14... 
pi <- "abc" 
pi # return "abc" 
+0

* "rpy2オブジェクト' r'は埋め込まれた "R"を表しています。 "*したがって、技術的には' robjects.globalenv'よりもさらに広い範囲ですか?これはプレーンRで同じ動作ですか?私は普通のRで、すべてのローカルスコープが失敗したときにすべてのものが 'Globalenv'に対して評価されると思います。 rpy2の 'robjects.r'はパッケージをソーシングし、その内部を参照するようですか? – Mahesha999

+0

文書を確認しましたか? (http://rpy2.readthedocs.io/en/version_2.8.x/introduction.html#the-r-instance、http://rpy2.readthedocs.io/en/version_2.8.x/robjects_rinstance.html 、http://rpy2.readthedocs.io/en/version_2.8.x/robjects_environments.html) – lgautier