我正在尝试调试这行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))
但是现在进一步考虑这个问题,我觉得这可能是问题所在。我是否需要再次将其转换为对角线才能正常工作,如果是,那该怎么办?
谢谢!
答案 0 :(得分:1)
正如@rawr指出的,do.call(rbind, as.list(mymatrix))
返回409x409乘1矩阵,因此,对角函数无法正确表达。解决方案是通过R包do.call
将rbind.fill
替换为plyr
,它以正确的形式成功引入矩阵,然后diag
函数执行它的方式应该。