#有三种方法调用R对象,分别“相当于”把r实例当作字典、把r实例当作方法、把r实例当作一个类对象 import rpy2.robjects as robjects ## 第一种, 把r实例当作字典 pi = robjects.r['pi'] print(pi) print(type(pi)) print(pi[0]) output: [1] 3.141593 3.141592653589793 ## 第二种, 把r实例当作方法 # 这种方法从某种程度上讲是万能的,因为可以将任意大小和长度的R代码写成一个python字符串,之后通过robjects.r('Rcode')调用执行 a = robjects.r('a<-c(1,2,3)') print(type(a)) print(list(a)) print(a[0:]) output: [1.0, 2.0, 3.0] [1] 1 2 3 ## 第三种,把r实例当作一个类对象 t2=robjects.r.pi # 这种方法对于名称中有“点号”的变量会出问题,比如data.frame/read.csv等 print(t2[0]) output: 3.141592653589793 ## Note #要注意:robjects.r("r_script") 可以执行r代码 #对于一些特殊的R对象比如list和matrix,如果python要调去其中的部分数据,可以通过其rx()和rx2()方法操作。 #对于list,可以查看其name属性,以获得列表个个元素名称。rx()和相当于"["操作(注意取出的是R的list对象),而rx2()相当于"[["操作。如下: #1 tmp = robjects.r("list(a = matrix(1:10, nrow = 2), b = 'Hello')") print(tmp) """ output: $a [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 $b [1] "Hello" """ #2 print(tmp.names) [1] "a" "b" #3 print(tmp.rx('a')) $a [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 #4 print(list(tmp.rx('a'))) [R object with classes: ('matrix',) mapped to: [1, 2, 3, 4, ..., 7, 8, 9, 10]] #5 print(tmp.rx(1)) $a [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 #6 print(tmp.rx2(1)) [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 #7 print(tmp.rx2('a').rx(1, 1)) # first element of 'a' [1] 1 #8 print(tmp.rx2('a').rx(1, True)[0])# first row of 'a' [1] 1 3 5 7 9 #9 print(list(tmp.rx2('a').rx(1, True))) [1, 3, 5, 7, 9] #10 b = [i for i in tmp.rx2('a').rx(1, True)] print(b) [1, 3, 5, 7, 9]