我正在尝试调试这行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
返回以下错误:
Traceback(最近一次调用最后一次):文件“”,第1行,在文件“C:\ Python27 \ lib \ site-packages \ rpy2 \ robjects \ functions.py”,第166行,在调用return super(SignatureTranslatedFunction,self ).call(* args,** kwargs)文件“C:\ Python27 \ lib \ site-packages \ rpy2 \ robjects \ functions.py”,第99行,在调用res = super(函数,自我).call(* new_args,** new_kwargs)RRuntimeError:diag中的错误< - (* tmp *,value = c(72999.27,1.3957676,2.79616323829879,:替换对角线长度错误
我查看the SVN.R website以查看 diag
函数的内部工作方式,以查看错误的来源:
if (len.v != 1L && len.v != len.i)
stop("replacement diagonal has wrong length")
我想那就告诉我我的答案,我的替换值不是合适的长度,对吗?那么我该如何让我的替换对角线达到合适的长度以便“粘住”?
EDIT --Added context for troubleshooting purposes--
该矩阵最初通过Python脚本生成为409x409数组(使用numpy),并使用 ro.r.assign
进行分配 . 然后,在我的R脚本中, mymatrix
最初(在R版本2.3.1表单中)调用使用:
mymatrix <- do.call("rbind", mymatrix)
但现在在2.15.3和Rpy2中,我在阵列上使用这个do.call时出错了 . 它会给我以下错误:
文件“”,第1行,文件“C:\ Python27 \ lib \ site-packages \ rpy2 \ robjects \ functions.py”,第166行,在调用return super(SignatureTranslatedFunction,self).call(* args,* * kwargs)文件“C:\ Python27 \ lib \ site-packages \ rpy2 \ robjects \ functions.py”,第99行,在调用res = super(Function,self).call(* new_args,** new_kwargs)RRuntimeError: do.call中出错(“rbind”,mymatrix):第二个参数必须是一个列表
所以我的_1339814为此只需使用 as.list
将其转换为如下所示的列表:
mymatrix <- do.call("rbind", as.list(mymatrix))
但是现在进一步考虑这个问题,我发现这可能是问题所在 . 我是否需要再次将其转换为对角线才能正常工作,如果是这样,怎么做?
谢谢!
1 回答
正如@rawr指出的那样,
do.call(rbind, as.list(mymatrix))
返回一个409x409乘1的矩阵,因此,对角函数无法正确表达 . 解决方案是通过R包plyr
替换do.call
与rbind.fill
,它成功地以正确的形式引入矩阵,然后diag
函数以它应该的方式执行 .