On Wed, Jun 08, 2011 at 12:22:10PM +0100, Prof Brian Ripley wrote: > 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. [...]
Hmhh, it was not randomly chosen, it was, what I got as a hint here on the list. > > >>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, [...] OK, I also sometimes used that (maybe I threw it out or used it in other modules). > 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"); [...] If it's a vector, I can just pic the first element. Or does LENGTH(sfile) give the length of the string itself (like strlen(3))? If the latter, then my file-opeing operation would faile with an error. Of course I check if my fopen() gibves back NULL. > > Then, reading on, > > file = translateChar(STRING_ELT(sfile, 0)); translateChar is explained on page 120 of the extension writing do. I'm not in this point of the documentation. And I often need to look around, when I want to find a function, as they are documented/explained somewhere during the flow of the text. Something like a API description that is brief would help. For example something like in the manuals of the OCaml language: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html That's very brief. Chapter 6 of the "Writing R Extensions" is rather in this style and gives a good overview. Something like that for the macros would be helpful. > > for you cannot (in general) assume that the character vector passed > is in the native encoding. I try to do some coercions (e.g. as.integer()) when I need integer in the C-code and then in the C-part rigidly check on integer. About the char-encodings I have not thought much. Ciao, Oliver ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel