rpy2和R调试

4
经过一些麻烦,我成功安装了rpy2。
我的目标是构建模型(gam;Simon Wood的库mgcv)并使用预测功能,通过将pandas数据框从Python传递到R中的gam模型,并检索预测结果。
通过加载txt文件并通过与Python/rpy2脚本调用的相同的R函数对其进行处理,测试了R脚本,它运行良好。在Python脚本中,我从文本文件的pickled版本开始(就像我在最终代码中一样,从pandas数据框开始)。
我还能够触发R脚本中的其他有意义的错误(传递一个空数据框或缺少一列的数据框以成功执行预测都会触发错误,正如在R中一样)。我实际上已经输入数据进入到了gam函数。
我已经接近完成,但我仍然遇到这个错误:
ExtractData(object, data, NULL)中的错误: 'names'属性[1]必须与向量[0]的长度相同
我不知道如何在我的Python脚本中获取更多来自R的反馈。我该如何调试?或者有人可以指出R中可能存在的问题吗?或者这是我没有完全掌握的“.convert_to_r_dataframe()”函数的一部分吗?
f_clean_data <- function(df) {
        t = df
        ... some preprocessing
        t

        }

tc <- f_clean_data(t) 


f_py_gam_predict <- function(gam, df) {
                dfc = f_clean_data(df)
                result <- predict(gam, dfc)
                result
                }

bc_gam = gam(BC ~   
                +s()
                .... some gam model

        , data=tc, method="REML"
        )
summary(bc_gam)


testfile = 'a_test_file.txt'

ttest <- read.table(file=testfile ,sep='\t',header=TRUE);

result = f_py_gam_predict(bc_gam, ttest)

f_py_gam_predict 可在 Python 脚本中使用。

谢谢, Luc


各位位数的版本可能会有所帮助。在 convert_to_r_dataframe 中存在问题,这使我必须为 pandas 进行转换(随 rpy2 一起提供,从版本 2.3.4 开始),但我也听说 convert_to_r_dataframe 在此期间已经得到修复。 - lgautier
2个回答

2

请检查您输入到 s() 的数据类型。当我使用日期时间解释变量时,我也遇到了Error in ExtractData(object, data, NULL) : 'names' attribute [1] must be the same length as the vector [0]。我通过转换为自开始以来的天数来解决了这个问题。

> library(lubridate)
> library(mgcv)
> df <- data.frame(x=today() + 1:20, y=1:20)
> gam(y~s(x), data=df)
Error in ExtractData(object, data, knots) : 
  'names' attribute [1] must be the same length as the vector [0]
> df$xnum <- (df$x - df$x[1])/ddays(1)
> str(df)
'data.frame':   20 obs. of  3 variables:
 $ x   : Date, format: "2013-04-09" "2013-04-10" "2013-04-11" "2013-04-12" ...
 $ y   : int  1 2 3 4 5 6 7 8 9 10 ...
 $ xnum: num  0 1 2 3 4 5 6 7 8 9 ...
> gam(y~s(xnum), data=df)

最后一个调用可以正常运行。

至于调试,我经常从rpy2中调用save.image(),然后将.RData文件加载到普通的R会话中进行进一步的检查。


1

通常的 R 调试工具可以在 RPy 中使用,例如

ro.r("debug(glm)")

或者 ro.r("options(error=recovery)")


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