Le 18/04/2018 à 12:26, Georgi Boshnakov a écrit :
I may be missing something here but
it doesn't seem right to introduce silent coercion of NULL to vectors, etc.,
especially if it would become imposed on everybody using Rcpp/Armadillo.
Nothing is imposed. Everyone will be free to use Nullable<T> mechanism as 
before.
Actually, when NULL is provided to where a vector or a matrix is expected
just an error is thrown. So we can hardly imagine that someone would have
his program broken or will be misled if such coercion is introduced.

Even the "convenience" of this  is questionable.
Right. It's a matter of taste. But with a quick glance on SO
I have seen a discussion here
https://stackoverflow.com/questions/34718570/rcpp-pass-vector-of-length-0-null-to-cppfunction
and on this list here (and follow-ups)
http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2014-February/007215.html
where some people are surprised not having such coercion and even
expressed a wish like "I would be super happy if in the future the special value
R_NilValue could be converted to an empty vector, it would make things
very easy and coherent with R's behaviour."
It's also my thought but I am ready to hear the arguments of those who
think otherwise.

Serguei.


Georgi Boshnakov


-----Original Message-----
From: rcpp-devel-boun...@lists.r-forge.r-project.org 
[mailto:rcpp-devel-boun...@lists.r-forge.r-project.org] On Behalf Of Serguei 
Sokol
Sent: 18 April 2018 10:57
To: Dirk Eddelbuettel
Cc: Rcpp-devel
Subject: Re: [Rcpp-devel] coercion NULL to vector

Le 17/04/2018 à 17:53, Dirk Eddelbuettel a écrit :

On 17 April 2018 at 10:31, Dirk Eddelbuettel wrote:
|
| On 17 April 2018 at 15:09, Serguei Sokol wrote:
...
| | It will automatically coerce NULL to a declared vector type.
| | It's a more primitive solution than Nullable<T> but in many cases
| | it can be largely sufficient and make code look shorter and clearer.
| |
| | Will it break something in established usage habits? Is it compatible with 
your plans for Rcpp?
| | I can prepare a PR if you decide to include it.
|
| We could test that.  It may not do harm -- so I just turned on a
| rev.dep check for it.
|
| Can you open an issue for it on GH though?  Better visibility and
| easier 'per concrete topic' discussion.
I was just about to do so when I saw your post here. So let decide if the 
semantic is useful or not and if yes, we'll switch to GH. OK?


I am not convinced that the semantics are useful.  Your example works
on the arma type (where we our very old design issue of always returning a 
matrix):
What is returned: a matrix or a vector is not important here. By the way, it is 
already resolved by an optional RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR macro, 
remember?
The point here is how the /input/ NULL is interpreted. Is it coerced to smth or 
just an error is thrown?


sourceCpp("/tmp/serguei.cpp")
f(NULL)
       [,1]
f(integer(0))
       [,1]
f()
Error in f() : argument "x" is missing, with no default
Normal. If you want to make the parameter optional, you have to declare vec 
f(Rcpp::NumericVector x=R_NilValue) {return x+1;}  > f()
       [,1]
It does not work yet with 'vec' type but it could with an appropriate patch.
We are just discussing the usefulness of semantics not yet the patch.

class(f(NULL))
[1] "matrix"
(not a big deal what is returned as discussed above).



But if I do the same with Rcpp types, say a matrix via

// [[Rcpp::export]]
Rcpp::NumericMatrix g(Rcpp::NumericMatrix x) { return x+1; }

then I get more restrictive behaviour (as NumericMatrix tests for
matrix)
Right. I think that the next logical step would be to allow an automatic coercion 
of atomic vectors to matrices too. As in R  > as.matrix(integer(0))
       [,1]
we got a matrix of dims (0, 1) we could make the same available in Rcpp.
More generally, a vector x could be coerced into a matrix of dims (length(x), 
1) (once again just as in R as.matrix())


sourceCpp("/tmp/serguei.cpp")
g(NULL)
Error in g(NULL) : Not a matrix.
g(matrix())
       [,1]
[1,]   NA
g(vector())
Error in g(vector()) : Not a matrix.
g(integer())
Error in g(integer()) : Not a matrix.


Is this really useful, and can you not use Nullable<> instead?
Sure I can, but as I already said, my thought is to make the code looking simpler and 
clearer in this kind of situations where automatic coercion does sufficient job. 
Nullable<T> is much more flexible than that but more expensive in coding on 
user's side.

Serguei.
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel


_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to