2014-09-26 2 views
1

R 코드 2.3.x로 작성되고 rpy와 함께 작동하지만 2.15.3으로 이동하고 rpy2로 이동하는이 R 코드 행을 디버깅하려고합니다. 그것은 부서진 것 같다? 내 행렬은 꽤 크고 길이는 409x409입니다. 대각선은 부동 정수로 채워져 있습니다 (제 생각에는?). 나는 모아진 원시 행렬 파일을보고 있는데, diags는 99999.00으로 채워진다. 세포의 나머지는 ##의 형식에 ##R 오류 : 교체 대각선 길이가 잘못되었습니다

해당 코드의 잘못된 라인 :. 내가 the SVN.R website 보았다

Traceback (most recent call last): File "", line 1, in File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 166, in call return super(SignatureTranslatedFunction, self).call(*args, **kwargs) File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 99, in call res = super(Function, self).call(*new_args, **new_kwargs) RRuntimeError: Error in diag<- (*tmp* , value = c(72999.27, 1.39576, 2.79616323829879, : replacement diagonal has wrong length

:

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

다음과 같은 오류를 반환 함수의 내부 동작을보고 오류의 출처를 확인하십시오.

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

내 대답은 내 대답을 말하는 것 같아, 내 교체 가치는 적절한 길이가 아니지, 그렇지? 그렇다면이 대칭의 "대치"를 위해 교체 대각선 길이를 적당한 길이로 늘리려면 어떻게해야합니까?

편집 --Added 문제에 대한 컨텍스트 Python 스크립트 통해

이 행렬은 초기에 409x409 어레이 (NumPy와 사용)로서 생성된다 purposes-- 및 ro.r.assign를 사용하여 할당.

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

하지만 지금 2.15.3 및 RPY2, 나는이 할 사용하여 오류가 발생했습니다 : 그런 다음 내 R 스크립트, mymatrix 사용하여 호출합니다 (R 버전 2.3.1 형태로) 원래이었다. 배열을 호출하십시오. 그것은 나에게 다음과 같은 오류 줄 것이다 :

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

하지만 지금 생각 :

File "", line 1, in File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 166, in call return super(SignatureTranslatedFunction, self).call(*args, **kwargs) File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 99, in call res = super(Function, self).call(*new_args, **new_kwargs) RRuntimeError: Error in do.call("rbind", mymatrix) : second argument must be a list

을 아래에 서면 그래서 이것에 대한 내 "수정"단순히 목록에 변환 as.list를 사용하는 것이 었습니다 더 나아가 이것이 아마도 문제라고 생각합니다. 대각선이 올바로 작동하려면 다시 이것을 변환해야합니까? 그렇다면 어떻게해야합니까?

감사합니다.

+0

적용 함수는 몇 개의 값을 리턴합니까? mymatrix에 NA가 있습니까? – rawr

+0

좋은 질문입니다. 추가 컨텍스트를 보려면 ** 편집 ** **을 읽어주십시오. 행렬에는 NAs가 있지만, 처음에는 수치적인 배열로 전달됩니다. 그러나이 문제가 발생하여이를 목록으로 변환했습니다. 그것은 내가 그것을 변형시키고 대각선을 수행 할 필요가있을 수 있지만 그것은 내가 잃어버린 곳입니다. – myClone

+1

'do.call (rbind, as.list (mymatrix))'는 행렬 [409 by 409] 행렬을 [409 * 409 by 1] 행렬로 변환하므로 문제가 될 가능성이 큽니다. 어쨌든 왜 당신이하려고 했어요? – rawr

답변

1

@ 오류가 지적한대로 do.call(rbind, as.list(mymatrix))은 409x409를 1 행렬로 반환하므로 대각 함수를 올바르게 정의 할 수 없습니다. 해결책은 do.callrbind.fill으로 바꾸고 R 패키지 plyr을 사용하여 매트릭스를 성공적으로 가져온 다음 diag 기능을 수행해야합니다.

+0

또한 plyr이 매우 유용하고 R 내의 행렬을 조작 할 때 성능이 상당히 빨라진다 고 덧붙일 것입니다! – myClone

관련 문제