On Tue, 7 Jun 2011, Duncan Murdoch wrote:

On 07/06/2011 9:08 AM, oliver wrote:
Hello,

following an advice here from the list I looked into sources of other
packages (xts) and found the TYPEOF() macro/function, which really is
helpful.

It is documented, of course, but actually better alternatives are described in 'Writing R Extensions'.

We would urge you to study the R sources rather than copy bad habits from randomly chosen package sources.

I iused the follwong code snippet:


   switch( TYPEOF( filename_sexp ) )
   {
         case STRSXP: filename = CHAR( STRING_ELT(filename_sexp, 0) );
                      break;

         default:     error("filename argument must be a string");
                      break;
   }


Here, filename is of type char*
and one function opens a file with that name.
So it is purely intended to just grab out the char* from the
String-Expression.

Am I doing something wrong here, or is it ok, but I have somehow
to say the extracting macros/functions, that it is really intended
to throw away information and that a warning is not necessary?

The result of calling CHAR should be a "const char *". You are not allowed to touch the string it points to.

Note too that isString() exists for this purpose, and there is no check in that code that LENGTH(filename_sexp) > 0 (or == 1). In the R sources you will often see things like

    if(!isString(sfile) || LENGTH(sfile) < 1)
        error("invalid '%s' argument", "description");

Then, reading on,

    file = translateChar(STRING_ELT(sfile, 0));

for you cannot (in general) assume that the character vector passed is in the native encoding.

--
Brian D. Ripley,                  rip...@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

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

Reply via email to