[Rcpp-devel] Handling NAs in RcppMatrix
Dirk Eddelbuettel
edd at debian.org
Sun Feb 7 02:01:33 CET 2010
Hi Leo,
On 6 February 2010 at 17:56, Leo Alekseyev wrote:
| Howdy folks,
| I started playing around with Rcpp recently, and so far haven't been
| able to figure out how to detect NAs in a matrix that I pass to the
| C++ code.
| My test code looks something like this:
| RcppExport SEXP rcpp_test(SEXP N1, SEXP V1, SEXP M1, SEXP parms) {
| .......
| RcppMatrix<double> m1(M1);// double mtx based on M1
| RcppVector<double> v1(V1);// double vector based on V1
| RcppParams rparam(parms); // parameter from R based on parms
| RcppResultSet rs;
| Rcpp::RObject n1sexp(N1);
|
| double n1 = n1sexp.asDouble();
| Rprintf("The value of isna is %d\n",R_IsNA(n1));
|
| double element1 = v1(0);
| if(R_IsNA(element1))
| Rprintf("Found NA in vector!\n");
|
| double m00 = m1(0,0);
| if(R_IsNA(m00))
| Rprintf("Found NA in matrix!\n");
| ................
That looks like the right approach.
So to give this some meat on the bone and some comparability, I added a new
unit test:
test.RcppMatrix.double.na.nan <- function() {
src <- 'RcppMatrix<double> m(x);
RcppResultSet rs;
rs.add("na_21", R_IsNA(m(1,0)));
rs.add("na_22", R_IsNA(m(1,1)));
rs.add("nan_31", R_IsNaN(m(2,0)));
rs.add("nan_32", R_IsNaN(m(2,1)));
return rs.getReturnList();';
funx <- cfunction(signature(x="numeric"), src, Rcpp=TRUE)
M <- matrix(1:6,3,2,byrow=TRUE)
M[2,1] <- NA
M[3,1] <- NaN
checkEquals(funx(x=M),
list(na_21=1, na_22=0, nan_31=1, nan_32=0),
msg = "RcppMatrix.double.na.nan")
}
This defines a function 'test.RcppMatrix.double.na.nan'. In it, we create a
function funx that evaluates the C++ code in src -- it tests positions (2,1),
(2,2), (3,1) and (3,2). We then create this matrix
R> M <- matrix(1:6,3,2,byrow=TRUE)
R> M[2,1] <- NA
R> M[3,1] <- NaN
R> M
[,1] [,2]
[1,] 1 2
[2,] NA 4
[3,] NaN 6
R>
and the compare with the result specified in the checkEquals call. And that
pans out:
R> checkEquals(funx(x=M),
+ list(na_21=1, na_22=0, nan_31=1, nan_32=0),
+ msg = "RcppMatrix.double.na.nan")
[1] TRUE
R>
What version were you running? I am at current SVN so somewhere past 0.7.4
and not quite release 0.7.5.
| The R_IsNA() appears to work fine on scalars and vectors, but fails to
| detect NA present in a matrix. Is this a bug?.. feature?.. Is the
| handling of missing values documented anywhere other than the R
| Extensions manual?..
We do not transform anything. R tests for NA and NaN with (IIRC) a
combination of IEEE754 (for NA) and a special value for NaN. That works here
as we use the R tests for ot.
| On a (probably) unrelated note, I get the following error when
| compiling my C++ code:
| Error in RcppCxx0xFlags() : could not find function "capture.output"
| Calls: <Anonymous> -> cat -> RcppCxx0xFlags
Not here either:
R> Rcpp:::RcppCxx0xFlags()
[1] "-std=c++0x"
R>
| However, the code seems to compile fine. The compilation script is simply
| #!/bin/bash
| export PKG_CPPFLAGS="-I. "$(r -e "Rcpp:::CxxFlags()" )
| export PKG_LIBS=$(r -e "Rcpp:::LdFlags()" )
| export CLINK_CPPFLAGS=$(r -e "Rcpp:::Cxx0xFlags()" )
| R CMD SHLIB "$@"
You may not need the third for CLINK_CPPFLAGS. We experimented with C++0x but
there are side effects on other OSs so we parked this for now.
| Complete output from compilation is pasted below -- is this an error I
| should be concerned about?..
| ./buildAndRun.sh rcpp_test.cpp --clean
| Error in RcppCxx0xFlags() : could not find function "capture.output"
| Calls: <Anonymous> -> cat -> RcppCxx0xFlags
| Execution halted
| g++ -I/usr/share/R/include -I/usr/local/lib/R/site-library/Rcpp/lib
| -fpic -g -O2 -c rcpp_test.cpp -o rcpp_test.o
| Error in RcppCxx0xFlags() : could not find function "capture.output"
| Calls: <Anonymous> -> cat -> RcppCxx0xFlags
| Execution halted
| Error in RcppCxx0xFlags() : could not find function "capture.output"
| Calls: <Anonymous> -> cat -> RcppCxx0xFlags
| Execution halted
| g++ -shared -o rcpp_test.so rcpp_test.o
| -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp
| -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib -L/usr/lib/R/lib -lR
| Error in RcppCxx0xFlags() : could not find function "capture.output"
| Calls: <Anonymous> -> cat -> RcppCxx0xFlags
| Execution halted
|
|
| Thanks in advance for any help (and please let me know if this is not
| the correct mailing list for these sorts of questions!)
Very much the right list! Thanks for asking here.
If you post your full shell script / test code I can have a go at testing it.
Dirk
| --Leo Alekseyev
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
--
Registration is open for the 2nd International conference R / Finance 2010
See http://www.RinFinance.com for details, and see you in Chicago in April!
More information about the Rcpp-devel
mailing list