【发布时间】:2014-11-21 18:25:17
【问题描述】:
我正在尝试调试这行 R 代码,它是用 R 版本 2.3.x 编写并与 R 版本一起使用并使用 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(Function, self).call(*new_args, **new_kwargs) RRuntimeError:
diag<-(*tmp*, value = c(72999.27, 1.39576, 2.79616323829879, 中的错误: 替换对角线长度错误
我查看了the SVN.R website 以了解diag函数的内部工作原理,看看错误来自哪里:
if (len.v != 1L && len.v != len.i)
stop("replacement diagonal has wrong length")
我认为这告诉了我我的答案,我的替换值不是正确的长度,对吧?那么我该如何让我的替换对角线长度合适,以便“粘住”呢?
编辑——添加了用于故障排除的上下文——
这个矩阵最初是通过 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) 中的错误:第二个参数必须是一个列表
所以我的“修复”是简单地使用as.list 将其转换为如下所示的列表:
mymatrix <- do.call("rbind", as.list(mymatrix))
但是现在进一步思考这个问题,我突然想到这可能就是问题所在。我是否需要再次将其转换回对角线才能正常工作,如果需要,如何?
谢谢!
【问题讨论】:
-
apply 函数返回多少个值? mymatrix 中有 NA 吗?
-
这是个好问题。您能否阅读我上面的 EDIT 以获取更多上下文?矩阵中有 NA,但它们最初是作为 numpy 数组传递的。但是,我遇到了这个问题并将其转换为列表。可能是我需要重新转换它然后执行对角线,但这就是我迷路的地方。
-
do.call(rbind, as.list(mymatrix))会将您的正方形 [409 x 409] 矩阵转换为 [409*409 x 1] 矩阵,因此这很可能是个问题。你为什么要这样做呢?还是调用 rbind? -
啊..那么我该如何重新转换它?另外,有没有比 do.call rbind 更好的方法?这段代码不是我写的——它是大约 10 年前由别人写的。我正在努力通过清理这段代码并在此过程中调试我的模型来学习 R 和 Python 以及所有这些东西。 ://
-
在那一行,如果 mymatrix 已经是一个矩阵,那么 rbinding 没有任何意义。该行之前的
str(mymatrix)是什么?我已经很久没有使用 r 了,所以我不能说在破坏此代码的更改之前 do.call 是如何工作的