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.

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.

Duncan Murdoch

NILSXP, as it might be close to a NULL might be interpreted as 0
length by LENGTH...

Nevertheless it's a littlebid confusing for people who don't know the
internals of R.

Will try length() soon.

Ciao,
    Oliver



P.S.: To be picky: NOT knowing the internals and nevertheless using the 
available
       functions/macros is called encapsulation in OO or the difference between
       interface and implementation... which is good style of programming.


______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to