Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Assigning an attribute to an empty vector in c++ produces an error #315

Open
pepijn-devries opened this issue May 13, 2023 · 3 comments
Open

Comments

@pepijn-devries
Copy link

pepijn-devries commented May 13, 2023

Thanks for your work on cpp11!

Please consider the following. In c++ the code below will produce the error: attempt to set an attribute on NULL

// Create an empty vector of raws:
cpp11::writable::raws x;
// Assign an attribute:
x.attr("my_attr") = "test";

This would make sense when x actually is a NULL, since in R the following code will produce the same error:

# Assign a NULL to 'x'
x <- NULL
# Try to set an attribute, which is not possible:
attr(x, "my_attr") <- "test"

However, I would expect the c++ code to behave as the following R code:

# Assign an empty vector of raws to 'x'
x <- raw(0)
# Set an attribute. No problems here
attr(x, "my_attr") <- "test"

which works fine.

My question is: Is this expected behaviour from cpp11? If so what would be the recommended strategy to set an attribute to an empty vector (i.e., a vector of a defined type but length zero) in c++ using cpp11. If this is not expected behaviour, can it be fixed?

My session looks like this:

R version 4.1.1 (2021-08-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19044)

Matrix products: default

locale:
[1] LC_COLLATE=Dutch_Netherlands.1252  LC_CTYPE=Dutch_Netherlands.1252    LC_MONETARY=Dutch_Netherlands.1252
[4] LC_NUMERIC=C                       LC_TIME=Dutch_Netherlands.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] cpp11_0.4.2

loaded via a namespace (and not attached):
 [1] compiler_4.1.1  magrittr_2.0.3  cli_3.4.1       tools_4.1.1     fs_1.5.0        glue_1.6.2      rstudioapi_0.13
 [8] vctrs_0.6.2     usethis_2.0.1   lifecycle_1.0.3 rlang_1.1.0     purrr_1.0.1
@stephematician
Copy link

I find it useful as is - under the hood it means that cpp11 doesn't make new expressions for R to manage unless (explicitly) asked to. For what it's worth, an empty vector in cpp11 can be initialised with:

cpp11::writable::doubles x(0);
// x <- numeric(0)

@pepijn-devries
Copy link
Author

Thank you for the quick response and clarification. However, your code won't compile on my machine, letting me know that call to constructor of writable::doubles (aka as 'r_vector') is ambiguous... I had to explicitly cast the int to R_xlen_t like so:

cpp11::writable::doubles x((R_xlen_t)0);

After this I was indeed able to set an attribute value;

Maybe some attention to the initialisation of vectors could be given in one of the vignettes?

@stephematician
Copy link

Ah I forgot that zero can be used to initialise other types and that leads to ambiguity. Definitely something that should be documented.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants