2017-09-10 3 views
1

에 나는 행렬의 목록을 가지고 노나 그들 중 일부는 다음과 같이, NA 있습니다확인 행렬의 목록의 요소가있는 경우 rcpp

listToCheck <- list(NA, matrix(0,nrow = 2, ncol = 2)) 

내가 확인 Rcpp에서 코드를 작성하고 싶습니다 리스트의 요소가 NA인지 아닌지를 나타냅니다.

나는

// [[Rcpp::depends(RcppArmadillo)]] 
#include <RcppArmadillo.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
bool checkNa(int i, List elemInCluster){ 

    arma::mat matrix = elemInCluster[i]; 

    if(R_IsNA(matrix(0,0))){ 
    return true; 
    } 

    return false; 
} 

다음 두 가지를 시도하지만 매트릭스는 NA 경우에도 첫 번째 요소에 액세스하려고으로 내가 checkNa(0, listToCheck)을 시도 할 때 Error in checkNa(0, listToCheck) : Not a matrix.을 제공대로 작동하지 않습니다.

R_IsNA는 double에서 작동하므로, 해당 요소 중 하나에 액세스하지 않고 행렬이 NA인지 확인하는 방법이 있습니까? this example가 작동하는 것 같다에서 같은 시도 - 캐치 사용

+0

기능을'''ARMA : is_finite'''은'''elemInCluster [I]'''에서 작동하지 않습니다. 이것이 왜 복제되어야하는지 더 잘 설명해주십시오. – adaien

+0

'NA', 'NaN'및 'NULL'감지는 여러 번 논의되었습니다. –

+0

그리고 list 요소는 NA가 될 수 없습니다. 이것은 하나의 NA 요소가있는 1x1 행렬입니다. 어쩌면 OP는 목록 요소 i가 NULL이 될 수도 있음을 의미합니다. 우리는 질문이 불충분하게 표현되고 재현 할 수없는 예제로 말할 수 없습니다. –

답변

-1

:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
bool checkNa(int i, List elemInCluster){ 

    try { 
    return R_IsNA(elemInCluster[i]); 
    } catch(...) { 
    return false; 
    } 
} 


> checkNa(0, listToCheck) 
[1] TRUE 

> checkNa(1, listToCheck) 
[1] FALSE 
+0

정말 나쁜 해킹이 있습니다. 이미 대답 한 이전 질문에서 더 나은 대답을보십시오. –

+1

'arma :: is_finite (elemInCluster [i])'는 컴파일되지 않습니다. 그래서 당신이 표시 한 중복이 어떻게 OP에 대한 더 나은 대답이 될지 모르겠습니다. –

+0

'NA', 'NaN'및 'NULL'감지는 여러 번 논의되었습니다. –