rpy2:如何通过调用 R 函数获取 return 值
rpy2: how to get the return values from calling a R function
我想在 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
?
PS:这是我第一次rpy2
,所以如果我做错了什么,请随时告诉我。
如上所示,bfast
方法显然 return 是一个嵌套对象,包含多层数据项。此外,returned Python 对象是具有嵌套的未命名元素的外部 class <class 'rpy2.robjects. vectors.ListVector'>
。
作为按整数位置挖掘 Python 对象的替代方法,考虑使用匿名包导入工具导入用户定义的 R 函数,STAP
,它允许您保留 R 代码特别是 return 您需要使用 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)
我想在 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
?
PS:这是我第一次rpy2
,所以如果我做错了什么,请随时告诉我。
如上所示,bfast
方法显然 return 是一个嵌套对象,包含多层数据项。此外,returned Python 对象是具有嵌套的未命名元素的外部 class <class 'rpy2.robjects. vectors.ListVector'>
。
作为按整数位置挖掘 Python 对象的替代方法,考虑使用匿名包导入工具导入用户定义的 R 函数,STAP
,它允许您保留 R 代码特别是 return 您需要使用 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)