`rpy2.robjects.r`和`rpy2.robjects.globalenv`之间的区别

时间:2016-11-04 10:56:03

标签: python r rpy2

我正在尝试使用rpy2从python调用R代码。在尝试一些代码时,我意识到我可以使用rpy2.robjects.r()来定义R函数(注意()而不是[],我正在调用r)。以这种方式定义的函数可以在rpy2.robjects.rrpy2.robjects.globalenv上编制索引。但是pi似乎不是这种情况。我可以rpy2.robjects.r['pi'],但我不能rpy2.robjects.globalenv['pi']

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 个答案:

答案 0 :(得分:1)

rpy2对象r旨在表示&#34; R&#34;运行嵌入式。您可以在调用中传递一个字符串(例如r("1+2")),该字符串将被评估为R代码并返回输出。

另一方面,globalenv是R&#34;环境&#34; .Globalenv。当你在R终端中声明对象时,这基本上就是对象。 R代码可以使这更清楚:

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

在R控制台中执行pi时,首先会在.GlobalEnv中搜索符号,如果找不到,则会搜索&#34;搜索路径&#34; (将加载的库)将被搜索。 pi位于R包&#34; base&#34;,IIRC中。

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