R错误:替换对角线长度错误

时间:2014-09-26 17:03:03

标签: r rpy2

我正在尝试调试这行R代码,它是用R版本2.3.x编写的,并且使用rpy调用但现在转移到2.15.3和rpy2,它似乎被打破了?我的矩阵非常大,长度为409x409。对角线上有浮动整数(我想?)。我正在查看拉入的原始矩阵文件,并且错误填充了99999.00。其余的单元格格式为##。##

有问题的代码行:

diag(mymatrix) <- apply(mymatrix, 1, function(x) min(x[x>0], na.rm=T)) * 0.73

返回以下错误:

  

追踪(最近一次通话):     文件&#34;&#34;,第1行,in     文件&#34; C:\ Python27 \ lib \ site-packages \ rpy2 \ robjects \ functions.py&#34;,第166行,调用       return super(SignatureTranslatedFunction,self)。 call (* args,** kwargs)     文件&#34; C:\ Python27 \ lib \ site-packages \ rpy2 \ robjects \ functions.py&#34;,第99行,调用       res = super(功能,自我)。调用(* new_args,** new_kwargs)   RRuntimeError:diag<-中的错误(*tmp*,值= c(72999.27,1.395676,2.79616323829879,:     替换对角线长度错误

我查看the SVN.R website以查看diag函数的内部工作原理,以查看错误的来源:

if (len.v != 1L && len.v != len.i)
stop("replacement diagonal has wrong length")

我认为那告诉我答案,我的替换价值不合适,对吗?那么我该怎么做才能让我的替换对角线达到适当的长度,以便“#34;坚持&#34 ;?

编辑 - 为故障排除目的添加了上下文 -

此矩阵最初通过Python脚本生成为409x409数组(使用numpy),并使用ro.r.assign进行分配。然后,在我的R脚本中,mymatrix最初(在R版本2.3.1表单中)使用:

mymatrix <- do.call("rbind", mymatrix)

但现在在2.15.3和Rpy2中,我在阵列上使用这个do.call时出错了。它会给我以下错误:

  

文件&#34;&#34;,第1行,in     文件&#34; C:\ Python27 \ lib \ site-packages \ rpy2 \ robjects \ functions.py&#34;,第166行,调用       return super(SignatureTranslatedFunction,self)。 call (* args,** kwargs)     文件&#34; C:\ Python27 \ lib \ site-packages \ rpy2 \ robjects \ functions.py&#34;,第99行,调用       res = super(功能,自我)。调用(* new_args,** new_kwargs)   RRuntimeError:do.call中出错(&#34; rbind&#34;,mymatrix):第二个参数必须是列表

所以我的#34;修复&#34;为此,只需使用as.list将其转换为如下所示的列表:

mymatrix <- do.call("rbind", as.list(mymatrix))

但是现在进一步考虑这个问题,我觉得这可能是问题所在。我是否需要再次将其转换为对角线才能正常工作,如果是,那该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:1)

正如@rawr指出的,do.call(rbind, as.list(mymatrix))返回409x409乘1矩阵,因此,对角函数无法正确表达。解决方案是通过R包do.callrbind.fill替换为plyr,它以正确的形式成功引入矩阵,然后diag函数执行它的方式应该。