Skip to content

[Rcpp-devel] Incorrect result of NA_REAL and NA_INTEGER

8 messages · Dirk Eddelbuettel, Akhila Chowdary Kolla, Bill Dunlap

#
Hello Everyone,

I am trying to use NA_REAL, NA_INTEGER, and R_NaN in my CPP code(doesn't
use R main). When I compile and run my code,* NA_REAL* it gives the value
as *nan* and *NA_INTEGER* gives the value as *-2147483648, and R_NaN as 0*.

I used the following code(from Rcpp FAQ):
Rcpp::IntegerVector Missing_I() {
  Rcpp::IntegerVector v(1);
  v[0] = NA_INTEGER; // NA
  return v;
}
Rcpp::NumericVector Missing_N() {
  Rcpp::NumericVector v(4);
  v[0] = R_NegInf; // -Inf
  v[1] = NA_REAL; // NA
  v[2] = R_PosInf; // Inf
  v[3] = R_NaN; // nan
  return v;
}

When I compile the functions using sourceCpp() I get the output as expected:
[1] NA
[1] -Inf   NA  Inf  NaN

But when I compile the code using the TestHarness it gives me the following
output:
missing_n values: -inf nan inf 0
missing_i values: -2147483648

I saved the above functions(Missing_I, Missing_N) in a header file and made
a call to those functions from the testharness:

TEST(deepstate_test,datatype){
RInside();
Rcpp::IntegerVector missing_i = Missing_I();
std::cout <<"missing_i values: "<< missing_i << std::endl;
Rcpp::NumericVector missing_n = Missing_N();
std::cout <<"missing_n values: "<< missing_n << std::endl;
}

How can I get the results as expected? Any help is appreciated.

Thanks,
Akhila
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20200904/f3b7c88e/attachment.html>
#
On 4 September 2020 at 11:24, Akhila Chowdary Kolla wrote:
| Hello Everyone,
| 
| I am trying to use NA_REAL, NA_INTEGER, and R_NaN in my CPP code(doesn't
| use R main). When I compile and run my code,* NA_REAL* it gives the value
| as *nan* and *NA_INTEGER* gives the value as *-2147483648, and R_NaN as 0*.
| 
| I used the following code(from Rcpp FAQ):
| Rcpp::IntegerVector Missing_I() {
|   Rcpp::IntegerVector v(1);
|   v[0] = NA_INTEGER; // NA
|   return v;
| }
| Rcpp::NumericVector Missing_N() {
|   Rcpp::NumericVector v(4);
|   v[0] = R_NegInf; // -Inf
|   v[1] = NA_REAL; // NA
|   v[2] = R_PosInf; // Inf
|   v[3] = R_NaN; // nan
|   return v;
| }
| 
| When I compile the functions using sourceCpp() I get the output as expected:
| > sourceCpp("~/R/RcppDeepState/inst/extdata/filesave.cpp")
| > Missing_I()
| [1] NA
| > Missing_N()
| [1] -Inf   NA  Inf  NaN
| 
| But when I compile the code using the TestHarness it gives me the following
| output:
| missing_n values: -inf nan inf 0
| missing_i values: -2147483648
| 
| I saved the above functions(Missing_I, Missing_N) in a header file and made
| a call to those functions from the testharness:
| 
| TEST(deepstate_test,datatype){
| RInside();
| Rcpp::IntegerVector missing_i = Missing_I();
| std::cout <<"missing_i values: "<< missing_i << std::endl;
| Rcpp::NumericVector missing_n = Missing_N();
| std::cout <<"missing_n values: "<< missing_n << std::endl;
| }
| 
| How can I get the results as expected? Any help is appreciated.

Am I understanding you correctly that you would like _the R behaviour_ but in
a non-R context (such as a catch or Google gtest harness) ?  You can't as
easily as R actively adds some extensions. I.e. IEEE 754 defines this for
doubles, but "nobody" besides R does it for Int. So you would have to add
your print function.

Dirk
4 days later
#
Thanks a lot for your quick response, Dirk. Instead of printing the vector
values using std::cout I am planning to serialize those objects using
saveRDS and trying to retrieve the stored values using readRDS. I am trying
to make use of the RInside instance to make a call to R functions. Although
the class variable is recognized as an integer in the below example, when I
use readRDS it says unknown input format. Is there a method to serialize
Rcpp objects using RInside from a testharness?

*Example:*
TEST(deepstate_test,datatype){
RInside R;
R["ms"] = 5;
std::string cmd = "cat(class(ms));saveRDS(ms,\"mtest.Rds\");
readRDS(\"mtest.Rds\")";
R.parseEval(cmd);
}
*Output:*
akhila at akhila-VirtualBox:~$ ./newtest







*TRACE: Running: deepstate_test_datatype from newtest.cpp(6)EXTERNAL:
integerEXTERNAL: �EXTERNAL: Error in readRDS("mtest.Rds") : unknown input
formatterminate called after throwing an instance of 'std::runtime_error'
what():  Error evaluating: cat(class(ms));saveRDS(ms,"mtest.Rds");
readRDS("mtest.Rds")ERROR: Failed: deepstate_test_datatype*

Also, I tried using the below code in my Cpp function. I still get the same
unknown input format error.

Rcpp::NumericMatrix mat = RcppDeepState_NumericMatrix();
Environment base("package:base");
Function saveRDS = base["saveRDS"];
saveRDS(mat,Named("file","mat.RDs"));
Function readRDS = base["readRDS"];
readRDS("mat.RDs");

Any help is appreciated. Thanks in advance

Regards,
Akhila Chowdary Kolla
On Fri, Sep 4, 2020 at 3:15 PM Dirk Eddelbuettel <edd at debian.org> wrote:

            
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20200908/24e264f4/attachment.html>
#
On 8 September 2020 at 16:03, Akhila Chowdary Kolla wrote:
| Thanks a lot for your quick response, Dirk. Instead of printing the vector
| values using std::cout I am planning to serialize those objects using
| saveRDS and trying to retrieve the stored values using readRDS. I am trying
| to make use of the RInside instance to make a call to R functions. Although
| the class variable is recognized as an integer in the below example, when I
| use readRDS it says unknown input format. Is there a method to serialize
| Rcpp objects using RInside from a testharness?
| 
| *Example:*
| TEST(deepstate_test,datatype){
| RInside R;
| R["ms"] = 5;
| std::string cmd = "cat(class(ms));saveRDS(ms,\"mtest.Rds\");
| readRDS(\"mtest.Rds\")";
| R.parseEval(cmd);
| }
| *Output:*
| akhila at akhila-VirtualBox:~$ ./newtest
| 
| 
| 
| 
| 
| 
| 
| *TRACE: Running: deepstate_test_datatype from newtest.cpp(6)EXTERNAL:
| integerEXTERNAL: �EXTERNAL: Error in readRDS("mtest.Rds") : unknown input
| formatterminate called after throwing an instance of 'std::runtime_error'
| what():  Error evaluating: cat(class(ms));saveRDS(ms,"mtest.Rds");
| readRDS("mtest.Rds")ERROR: Failed: deepstate_test_datatype*
| 
| Also, I tried using the below code in my Cpp function. I still get the same
| unknown input format error.
| 
| Rcpp::NumericMatrix mat = RcppDeepState_NumericMatrix();
| Environment base("package:base");
| Function saveRDS = base["saveRDS"];
| saveRDS(mat,Named("file","mat.RDs"));
| Function readRDS = base["readRDS"];
| readRDS("mat.RDs");
| 
| Any help is appreciated. Thanks in advance

That leaves me a little puzzled. No immediate suggestion.

Restoring an R-written RDS with another R session should always work.  Strange.

Dirk
 
| Regards,
| Akhila Chowdary Kolla
|
| On Fri, Sep 4, 2020 at 3:15 PM Dirk Eddelbuettel <edd at debian.org> wrote:
| 
| >
| > On 4 September 2020 at 11:24, Akhila Chowdary Kolla wrote:
| > | Hello Everyone,
| > |
| > | I am trying to use NA_REAL, NA_INTEGER, and R_NaN in my CPP code(doesn't
| > | use R main). When I compile and run my code,* NA_REAL* it gives the value
| > | as *nan* and *NA_INTEGER* gives the value as *-2147483648, and R_NaN as
| > 0*.
| > |
| > | I used the following code(from Rcpp FAQ):
| > | Rcpp::IntegerVector Missing_I() {
| > |   Rcpp::IntegerVector v(1);
| > |   v[0] = NA_INTEGER; // NA
| > |   return v;
| > | }
| > | Rcpp::NumericVector Missing_N() {
| > |   Rcpp::NumericVector v(4);
| > |   v[0] = R_NegInf; // -Inf
| > |   v[1] = NA_REAL; // NA
| > |   v[2] = R_PosInf; // Inf
| > |   v[3] = R_NaN; // nan
| > |   return v;
| > | }
| > |
| > | When I compile the functions using sourceCpp() I get the output as
| > expected:
| > | > sourceCpp("~/R/RcppDeepState/inst/extdata/filesave.cpp")
| > | > Missing_I()
| > | [1] NA
| > | > Missing_N()
| > | [1] -Inf   NA  Inf  NaN
| > |
| > | But when I compile the code using the TestHarness it gives me the
| > following
| > | output:
| > | missing_n values: -inf nan inf 0
| > | missing_i values: -2147483648
| > |
| > | I saved the above functions(Missing_I, Missing_N) in a header file and
| > made
| > | a call to those functions from the testharness:
| > |
| > | TEST(deepstate_test,datatype){
| > | RInside();
| > | Rcpp::IntegerVector missing_i = Missing_I();
| > | std::cout <<"missing_i values: "<< missing_i << std::endl;
| > | Rcpp::NumericVector missing_n = Missing_N();
| > | std::cout <<"missing_n values: "<< missing_n << std::endl;
| > | }
| > |
| > | How can I get the results as expected? Any help is appreciated.
| >
| > Am I understanding you correctly that you would like _the R behaviour_ but
| > in
| > a non-R context (such as a catch or Google gtest harness) ?  You can't as
| > easily as R actively adds some extensions. I.e. IEEE 754 defines this for
| > doubles, but "nobody" besides R does it for Int. So you would have to add
| > your print function.
| >
| > Dirk
| >
| > --
| > https://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
| >
#
a) Does the 'rds' file you tried to make exist?
   file.exists("mat.RDs")
b) It should have a more than c. 10 bytes in it.
   file.size("mat.RDs")
c) It should start with the with the 2-byte "magic number" for gzip files,
1f 8b:
   readBin("mat.RDs", what=raw(), n=20)
 [1] 1f 8b 08 00 00 00 00 00 00 06 8b e0 62 60 60 60 66 60 61 60
d) When unzipped it should start with the rds header, 58 0a, then version 3,
then the version of R that made it (4 0 2), and the earliest version of R
that can
read it (3 5 0):
  readBin(gzfile("mat.RDs","rb"), what=raw(), n=20)
 [1] 58 0a 00 00 00 03 00 04 00 02 00 03 05 00 00 00 00 06 43 50

Failure of d will give you the "unknown input format" error'.  Failure
of c means you used compress=FALSE in the call to saveRDS.

-Bill
On Tue, Sep 8, 2020 at 4:11 PM Dirk Eddelbuettel <edd at debian.org> wrote:

            
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20200908/9a570578/attachment-0001.html>
#
Hello Bill,

Thanks for the information.When I run the specified commands on the
generated mat.RDs file I get the following:
[1] TRUE
[1] 37
[1] 8b e0 62 60 60 60 66 60 66 03 62 56 20 93 81 35 34 c4 4d d7
[1] 8b e0 62 60 60 60 66 60 66 03 62 56 20 93 81 35 34 c4 4d d7
I used compress=TRUE in saveRDS function call while generating the
file(mat.RDs) it still gives me the result starting with 8b instead of 1f.
Please Advice.

Thanks,
Akhila Chowdary
On Tue, Sep 8, 2020 at 4:29 PM Bill Dunlap <williamwdunlap at gmail.com> wrote:

            
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20200908/87f73833/attachment.html>
#
That pattern of bytes does not ring a bell with me.

-Bill

On Tue, Sep 8, 2020 at 4:55 PM Akhila Chowdary Kolla <
akhilakollasrinu424jf at gmail.com> wrote:

            
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20200908/2e88efe2/attachment-0001.html>
#
On 8 September 2020 at 17:43, Bill Dunlap wrote:
| That pattern of bytes does not ring a bell with me.

And Bill is spot on which leads to a suggested debug route:
 - write a test RDS file with a simple RInside app outside of DeepState
 - read it back in, also outside of DeepState

If that works then you have a side effect from your setup. Maybe some library
gets shadowed or what not.

Dirk