On Thu, Jun 09, 2011 at 10:54:28AM -0400, Duncan Murdoch wrote: > On 09/06/2011 9:28 AM, oliver wrote: > >On Thu, Jun 09, 2011 at 07:43:20AM -0400, Duncan Murdoch wrote: > >> On 11-06-09 7:27 AM, oliver wrote: > >> >On Wed, Jun 08, 2011 at 08:35:34PM -0400, Simon Urbanek wrote: > >> >> > >> >>On Jun 8, 2011, at 8:32 PM, oliver wrote: > >> >> > >> >>>On Thu, Jun 09, 2011 at 02:17:31AM +0200, oliver wrote: > >> >>>[...] > >> >>>>OK, I looked at this now. > >> >>>> > >> >>>>LENGTH() checks the length of the vector. > >> >>>> > >> >>>>Good to know this. > >> >>>> > >> >>>>So the problem of a vector of length 0 can be with any arguments of > >> type SEXP, > >> >>>>hence I will need to check ANY arg on it's length. > >> >>>> > >> >>>>This is vital to stability under any situation. > >> >>>> > >> >>>>Thanks for this valuable hint! > >> >>>> > >> >>>>I will add checks for all my SEXP-args. > >> >>>[...] > >> >>> > >> >>>Hey, LENGTH() does not work with String-vectors! :( > >> >>> > >> >> > >> >>Of course it does ... > >> >> > >> >> > >> > > >> >It does not so on my R 2.10.1 installation. > >> > > >> > > >> >In the R-Shell I get: > >> > > >> > ============================== > >> > > length(c()) > >> > [1] 0 > >> > > > >> > ============================== > >> > > >> >So c() is vec of length 0. > >> > > >> >When I feed my readjpeg() with c() as filename arg, > >> > > >> >testing with: > >> >==================================================== > >> > if( LENGTH( filename_sexp )< 1 ) > >> > { > >> > error("LENGTH( filename_sexp )< 1"); > >> > //error("filename can't be vector of length 0"); > >> > } > >> > else > >> > { > >> > error("LENGTH( filename_sexp ) is not< 1"); > >> > } > >> >==================================================== > >> > > >> > > >> >I got: > >> > Error in readjpeg(filename = c()) : LENGTH( filename_sexp ) is not< > >> 1 > >> > > >> > > >> >You can explain why? > >> > >> c() doesn't create a STRSXP, it is NULL, which is a NILSXP. > >> LENGTH() doesn't work on that object. (I'd recommend using length() > >> rather than LENGTH(); it's a function, not a macro, and it does give > >> the expected answer.) > >[...] > > > >Interestingly, c() as value for an integer value > >can be testes correctly with LENGTH(). > > Presumably you converted it to an INTSXP. c() is NULL. [...]
Ooops, yes. In the R-part. :-) I did it, because when I don't get an int from the user's call, I have set it to NA (default in the R-function definition). I made width <- as.integer(width) for easy check inside the C-part, on integer. (I really only need int, no floating point values.) I thought this makes the C-code easier at that part. Or I may check on NA inside the C-part. How would I do that correctly? After so much different opinions I read here, I'm rather puzzled on that now. If there is already a R-extensions-FAQ I could collect the informations from the mail sof the last days, so that the different opinions and the discussion can result in a some answers... > > >So the question arises: is c() always creating NILSXP, > >or is it NILSXP only for STRSXP, and 0 otherwise? > > That question makes no sense at all. It make sense for the picky. As NULL is rather (void*)0 and a pointer is not an int (just can be coerced normally) ;) Ciao, Oliver ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel