rpy2:如何获取调用R函数的返回值

5

我希望在Python中使用以下的R脚本:

> library(bfast)
> apple <- read.csv("/Users/nskalis/Downloads/R/apple.csv", sep = ";", header=TRUE)
> data = apple
# data$in_bps: is vector of double numbers
> data.ts <- ts(data$in_bps, frequency=1)
> data.fit <- bfast(data.ts, h=0.1, season="none", max.iter=1)
> data.fit$output[[1]]$Tt
> data.fit$output[[1]]$Vt.bp
> data.fit$output[[1]]$ci.Vt
> data.fit$output[[1]]$ci.Vt$confint

因此,我使用rpy2,并完成了以下操作:
from rpy2.robjects.packages import importr
import rpy2.robjects as robjects
importr("bfast")
data = range(1,100)
data = robjects.FloatVector(data)
data = robjects.r.ts(data, frequency=1)
x = robjects.r.bfast(data, h=0.1, season="none", max_iter=1)

结果变量x等于
In [42]: x
Out[42]: 
R object with classes: ('bfast',) mapped to:
<ListVector - Python:0x7f234f7ad6c8 / R:0x76a2d60>
[Float..., ListV..., ListV..., ..., Float..., BoolV..., ListV...]
  Yt: <class 'rpy2.robjects.vectors.FloatVector'>
  R object with classes: ('ts',) mapped to:
<FloatVector - Python:0x7f234fd22dc8 / R:0x7605740>
[1.000000, 2.000000, 3.000000, ..., 97.000000, 98.000000, 99.000000]
R object with classes: ('bfast',) mapped to:
<ListVector - Python:0x7f234f7ad6c8 / R:0x76a2d60>
[Float..., ListV..., ListV..., ..., Float..., BoolV..., ListV...]
R object with classes: ('bfast',) mapped to:
<ListVector - Python:0x7f234f7ad6c8 / R:0x76a2d60>
[Float..., ListV..., ListV..., ..., Float..., BoolV..., ListV...]
  ...
  Yt: <class 'rpy2.robjects.vectors.FloatVector'>
  R object with classes: ('numeric',) mapped to:
<FloatVector - Python:0x7f234c053388 / R:0x586b668>
[0.000000]
  output: <class 'rpy2.robjects.vectors.BoolVector'>
  R object with classes: ('logical',) mapped to:
<BoolVector - Python:0x7f234c04eac8 / R:0x57ee518>
[NA]
R object with classes: ('bfast',) mapped to:
<ListVector - Python:0x7f234f7ad6c8 / R:0x76a2d60>
[Float..., ListV..., ListV..., ..., Float..., BoolV..., ListV...]

请问如何获取变量data.fit$output[[1]]$Vt.bp

注:这是我第一次使用rpy2,如果我已经做错了什么,请随时给予建议。


我猜结果中没有引用,因为其他所有内容都是向量,并且所需的数据位于: list(x [1] [0] [4] [0]) - nskalis
1
你看过文档了吗?http://rpy2.readthedocs.io/en/version_2.8.x/vector.html#extracting-items - lgautier
1个回答

2
如上所示,bfast方法显然返回一个嵌套对象,其中包含深层次的数据项。此外,返回的Python对象是一个外部类<class 'rpy2.robjects. vectors.ListVector'>,其中包含嵌套的未命名元素。
作为一种替代方法,考虑使用匿名软件包导入工具STAP导入用户定义的R函数,该工具允许您保留R代码,并使用R的命名元素术语明确返回所需的变量。
from rpy2.robjects.packages import STAP

r_fct_string ='''   
bfast_out <- function(path){
    data <- read.csv(path, sep = ";", header=TRUE)

    data.ts <- ts(data$in_bps, frequency=1)
    data.fit <- bfast(data.ts, h=0.1, season="none", max.iter=1)

    data.fit$output[[1]]$Vt.bp    
}
'''

r_pkg = STAP(r_fct_string, "r_pkg")

Vt_bp = r_pkg.bfast_out("/Users/nskalis/Downloads/R/apple.csv")

print(Vt_bp)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接