Re: [Rd] missing IntegerFromString()
I am sorry about the confusion, I was too hasty. asInteger(coerceVector(x,INTSXP)) does not work after all. Here are more details of what I am trying to accomplish: I have a matrix with column names that are actually known to be integers (because I set them so myself in the R code, say, colnames(mat) - 1:10. Of course, they become converted to character strings.) The relevant part of my code used to be: SEXP MyFunction(SEXP mat); int warn, minY SEXP rl, cl; char *rn, *cn; GetMatrixDimnames(mat, rl, cl, rn, cn); minY = IntegerFromString(VECTOR_ELT(cl,0), warn); if (warn 0) error(Names of popmatrix columns are not integers); Running some tests it appears that VECTOR_ELT(cl,0) is CHARSXP (which I wound up using without even knowing it). I tried replacing the IntegerFromString part with both asInteger(VECTOR_ELT(cl,0)) and with asInteger(coerceVector(VECTOR_ELT(cl,0),INTSXP)), but as you surmised, since VECTOR_ELT(cl,0) is CHARSXP, it does not work. So, how could I get the actual values in the column names? Thanks for all your help, Aniko -Original Message- From: Prof Brian Ripley [mailto:[EMAIL PROTECTED] Sent: Thursday, June 07, 2007 12:51 PM To: Simon Urbanek Cc: Douglas Bates; Aniko Szabo Subject: Re: [Rd] missing IntegerFromString() On Thu, 7 Jun 2007, Simon Urbanek wrote: On Jun 7, 2007, at 1:00 PM, Prof Brian Ripley wrote: On Thu, 7 Jun 2007, Simon Urbanek wrote: On Jun 7, 2007, at 11:33 AM, Douglas Bates wrote: On 6/6/07, Aniko Szabo [EMAIL PROTECTED] wrote: Thanks to everybody who responded to my question. asInteger(coerceVector(x,INTSXP)) indeed does what I need. I guess there is a lot I don't understand about type coercion, as I would not have expected it to work. It is better to use asInteger(x) which will do the coercion if necessary. Unfortunately not if it gets a character vector: Yes, if it gets a character *vector*, no if it gets a CHARSXP. Indeed, I was starting with an assumption that the task at hand is to get the same result as as.integer in R code from a string - mea culpa. I had the impression that it was likely what Aniko wanted (because anything else would work with trivial asInteger which I assumed was not enough). Yes, I made too many unsafe assumptions ;). You weren't the only one: I think we all are a little confused here The positive outcome is that I will make asInteger work on CHARSXPs as well. Brian Sorry for the noise, Simon .Call(foo,1) Error: unimplemented type 'character' in 'asInteger' When you do the coercion yourself you should PROTECT the result then UNPROTECT it. Calling asInteger directly avoids this overhead without the risk of losing data in a garbage collection. asInteger can accomplish this because only the first element of the SEXP x is converted to an integer. It could, but doesn't ;). That is what the original IntegerFromString did, but now you either have to do that yourself or coerce the whole vector (not as efficient but easier to write :P). But does coerceVector really handle CHARSXPs? There are not vectors and I don't see it in the code. Consider #include Rinternals.h SEXP foo(SEXP x) { return coerceVector(STRING_ELT(x, 0), INTSXP); } SEXP foo2(SEXP x) { Rprintf(%d\n, asInteger(STRING_ELT(x, 0))); return x; } .Call(foo,1) Error: cannot coerce type char to integer vector .Call(foo2,1) -2147483648 [1] 1 (and that is NA_INTEGER). As I said, if asInteger(coerceVector(x,INTSXP)) works, 'x' is not a CHARSXP. So I have little idea what the actual story here is. Brian Cheers, Simon Aniko -Original Message- From: Seth Falcon [mailto:[EMAIL PROTECTED] Sent: Tuesday, June 05, 2007 11:24 PM To: Aniko Szabo Cc: r-devel@r-project.org Subject: Re: [Rd] missing IntegerFromString() Hi Aniko, Aniko Szabo [EMAIL PROTECTED] writes: I have created a DLL not so long ago using C code. My code used the IntegerFromString() function that used to be exported in the Rinternals.h header file (and thus easily accessible). Recently I upgraded to R 2.5.0 and my DLL stopped working. I see that the IntegerFromString() function is not exported in any of the header files in the RHOME\include directory. Is it possible for me to use it without installing all R source files? I can see that the function is in coerce.c, however it #includes other stuff that I don't have and I am afraid to mess things about by doing things I don't understand. Or perhaps there is another function that is intended to be used instead? I think you want asInteger (which calls IntegerFromString). This is in RHOME/include/Rinternals.h Best Wishes, + seth PS: Nice to see you again :-) -- Seth Falcon | Computational Biology | Fred Hutchinson Cancer Research Center http://bioconductor.org __ R-devel@r-project.org
Re: [Rd] missing IntegerFromString()
Aniko Szabo [EMAIL PROTECTED] writes: I am sorry about the confusion, I was too hasty. asInteger(coerceVector(x,INTSXP)) does not work after all. Here are more details of what I am trying to accomplish: I have a matrix with column names that are actually known to be integers (because I set them so myself in the R code, say, colnames(mat) - 1:10. Of course, they become converted to character strings.) The relevant part of my code used to be: SEXP MyFunction(SEXP mat); int warn, minY SEXP rl, cl; char *rn, *cn; GetMatrixDimnames(mat, rl, cl, rn, cn); minY = IntegerFromString(VECTOR_ELT(cl,0), warn); if (warn 0) error(Names of popmatrix columns are not integers); Running some tests it appears that VECTOR_ELT(cl,0) is CHARSXP (which I wound up using without even knowing it). I tried replacing the IntegerFromString part with both asInteger(VECTOR_ELT(cl,0)) and with asInteger(coerceVector(VECTOR_ELT(cl,0),INTSXP)), but as you surmised, since VECTOR_ELT(cl,0) is CHARSXP, it does not work. So, how could I get the actual values in the column names? How about: SEXP colnums; int *ivals; PROTECT(colnums = coerceVector(cl, INTSXP)); ivals = INTEGER(colnums); Here you convert the STRSXP cl into an INTSXP. If you want the actual integer values, use the ivals pointer. + seth -- Seth Falcon | Computational Biology | Fred Hutchinson Cancer Research Center http://bioconductor.org __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] missing IntegerFromString()
On Thu, 7 Jun 2007, Aniko Szabo wrote: I am sorry about the confusion, I was too hasty. asInteger(coerceVector(x,INTSXP)) does not work after all. Here are more details of what I am trying to accomplish: I have a matrix with column names that are actually known to be integers (because I set them so myself in the R code, say, colnames(mat) - 1:10. Of course, they become converted to character strings.) The relevant part of my code used to be: SEXP MyFunction(SEXP mat); int warn, minY SEXP rl, cl; char *rn, *cn; GetMatrixDimnames(mat, rl, cl, rn, cn); minY = IntegerFromString(VECTOR_ELT(cl,0), warn); if (warn 0) error(Names of popmatrix columns are not integers); Running some tests it appears that VECTOR_ELT(cl,0) is CHARSXP (which I wound up using without even knowing it). I tried replacing the IntegerFromString part with both asInteger(VECTOR_ELT(cl,0)) and with asInteger(coerceVector(VECTOR_ELT(cl,0),INTSXP)), but as you surmised, since VECTOR_ELT(cl,0) is CHARSXP, it does not work. So, how could I get the actual values in the column names? if(length(cl) 0) minY = INTEGER(coerceVector(cl, INTSXP))[0]; else minY = NA_INTEGER; You are assuming that there is at least one dimname, and your code needs more careful checks. cl could be NULL and it could be of length 0. If not NULL it is (currently) guaranteed to be a STRSXP. In future versions of R 'minY = asInteger(cl)' will be all that is needed. [Private message posted to the list deleted: you are not allowed to do that, as the posting guide points out. It is a breach of copyright law.] -- Brian D. Ripley, [EMAIL PROTECTED] 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, UKFax: +44 1865 272595 __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] missing IntegerFromString()
Thanks to everybody who responded to my question. asInteger(coerceVector(x,INTSXP)) indeed does what I need. I guess there is a lot I don't understand about type coercion, as I would not have expected it to work. Aniko -Original Message- From: Seth Falcon [mailto:[EMAIL PROTECTED] Sent: Tuesday, June 05, 2007 11:24 PM To: Aniko Szabo Cc: r-devel@r-project.org Subject: Re: [Rd] missing IntegerFromString() Hi Aniko, Aniko Szabo [EMAIL PROTECTED] writes: I have created a DLL not so long ago using C code. My code used the IntegerFromString() function that used to be exported in the Rinternals.h header file (and thus easily accessible). Recently I upgraded to R 2.5.0 and my DLL stopped working. I see that the IntegerFromString() function is not exported in any of the header files in the RHOME\include directory. Is it possible for me to use it without installing all R source files? I can see that the function is in coerce.c, however it #includes other stuff that I don't have and I am afraid to mess things about by doing things I don't understand. Or perhaps there is another function that is intended to be used instead? I think you want asInteger (which calls IntegerFromString). This is in RHOME/include/Rinternals.h Best Wishes, + seth PS: Nice to see you again :-) -- Seth Falcon | Computational Biology | Fred Hutchinson Cancer Research Center http://bioconductor.org __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] missing IntegerFromString()
On 6/6/07, Aniko Szabo [EMAIL PROTECTED] wrote: Thanks to everybody who responded to my question. asInteger(coerceVector(x,INTSXP)) indeed does what I need. I guess there is a lot I don't understand about type coercion, as I would not have expected it to work. It is better to use asInteger(x) which will do the coercion if necessary. When you do the coercion yourself you should PROTECT the result then UNPROTECT it. Calling asInteger directly avoids this overhead without the risk of losing data in a garbage collection. asInteger can accomplish this because only the first element of the SEXP x is converted to an integer. Aniko -Original Message- From: Seth Falcon [mailto:[EMAIL PROTECTED] Sent: Tuesday, June 05, 2007 11:24 PM To: Aniko Szabo Cc: r-devel@r-project.org Subject: Re: [Rd] missing IntegerFromString() Hi Aniko, Aniko Szabo [EMAIL PROTECTED] writes: I have created a DLL not so long ago using C code. My code used the IntegerFromString() function that used to be exported in the Rinternals.h header file (and thus easily accessible). Recently I upgraded to R 2.5.0 and my DLL stopped working. I see that the IntegerFromString() function is not exported in any of the header files in the RHOME\include directory. Is it possible for me to use it without installing all R source files? I can see that the function is in coerce.c, however it #includes other stuff that I don't have and I am afraid to mess things about by doing things I don't understand. Or perhaps there is another function that is intended to be used instead? I think you want asInteger (which calls IntegerFromString). This is in RHOME/include/Rinternals.h Best Wishes, + seth PS: Nice to see you again :-) -- Seth Falcon | Computational Biology | Fred Hutchinson Cancer Research Center http://bioconductor.org __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] missing IntegerFromString()
On Jun 7, 2007, at 11:33 AM, Douglas Bates wrote: On 6/6/07, Aniko Szabo [EMAIL PROTECTED] wrote: Thanks to everybody who responded to my question. asInteger(coerceVector(x,INTSXP)) indeed does what I need. I guess there is a lot I don't understand about type coercion, as I would not have expected it to work. It is better to use asInteger(x) which will do the coercion if necessary. Unfortunately not if it gets a character vector: .Call(foo,1) Error: unimplemented type 'character' in 'asInteger' When you do the coercion yourself you should PROTECT the result then UNPROTECT it. Calling asInteger directly avoids this overhead without the risk of losing data in a garbage collection. asInteger can accomplish this because only the first element of the SEXP x is converted to an integer. It could, but doesn't ;). That is what the original IntegerFromString did, but now you either have to do that yourself or coerce the whole vector (not as efficient but easier to write :P). Cheers, Simon Aniko -Original Message- From: Seth Falcon [mailto:[EMAIL PROTECTED] Sent: Tuesday, June 05, 2007 11:24 PM To: Aniko Szabo Cc: r-devel@r-project.org Subject: Re: [Rd] missing IntegerFromString() Hi Aniko, Aniko Szabo [EMAIL PROTECTED] writes: I have created a DLL not so long ago using C code. My code used the IntegerFromString() function that used to be exported in the Rinternals.h header file (and thus easily accessible). Recently I upgraded to R 2.5.0 and my DLL stopped working. I see that the IntegerFromString() function is not exported in any of the header files in the RHOME\include directory. Is it possible for me to use it without installing all R source files? I can see that the function is in coerce.c, however it #includes other stuff that I don't have and I am afraid to mess things about by doing things I don't understand. Or perhaps there is another function that is intended to be used instead? I think you want asInteger (which calls IntegerFromString). This is in RHOME/include/Rinternals.h Best Wishes, + seth PS: Nice to see you again :-) -- Seth Falcon | Computational Biology | Fred Hutchinson Cancer Research Center http://bioconductor.org __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] missing IntegerFromString()
On Thu, 7 Jun 2007, Douglas Bates wrote: On 6/6/07, Aniko Szabo [EMAIL PROTECTED] wrote: Thanks to everybody who responded to my question. asInteger(coerceVector(x,INTSXP)) indeed does what I need. I guess there is a lot I don't understand about type coercion, as I would not have expected it to work. It is better to use asInteger(x) which will do the coercion if necessary. When you do the coercion yourself you should PROTECT the result then UNPROTECT it. Calling asInteger directly avoids this overhead without the risk of losing data in a garbage collection. asInteger can accomplish this because only the first element of the SEXP x is converted to an integer. I have to say I am puzzled. IntegerFromString works on a CHARSXP, and furthermore does not check its argument (which is one reason why it is no longer even exposed). AFAICS, coerceVector(x,INTSXP) will not accept a CHARSXP, but it will accept a STRSXP. (The same for asInteger.) So two ways to do this for vector 'x' are asInteger(x) INTEGER(coerceVector(x,INTSXP))[0] provided in the second case you know 'x' has length at least 1. But the first is both safer and more efficient. If you really have a CHARSXP, then you are not really supposed to work with 'bare' CHARSXPs unless you know what you are doing (in which case you don't need to ask ...). Aniko -Original Message- From: Seth Falcon [mailto:[EMAIL PROTECTED] Sent: Tuesday, June 05, 2007 11:24 PM To: Aniko Szabo Cc: r-devel@r-project.org Subject: Re: [Rd] missing IntegerFromString() Hi Aniko, Aniko Szabo [EMAIL PROTECTED] writes: I have created a DLL not so long ago using C code. My code used the IntegerFromString() function that used to be exported in the Rinternals.h header file (and thus easily accessible). Recently I upgraded to R 2.5.0 and my DLL stopped working. I see that the IntegerFromString() function is not exported in any of the header files in the RHOME\include directory. Is it possible for me to use it without installing all R source files? I can see that the function is in coerce.c, however it #includes other stuff that I don't have and I am afraid to mess things about by doing things I don't understand. Or perhaps there is another function that is intended to be used instead? I think you want asInteger (which calls IntegerFromString). This is in RHOME/include/Rinternals.h Best Wishes, + seth PS: Nice to see you again :-) -- Seth Falcon | Computational Biology | Fred Hutchinson Cancer Research Center http://bioconductor.org __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel -- Brian D. Ripley, [EMAIL PROTECTED] 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, UKFax: +44 1865 272595 __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] missing IntegerFromString()
On Thu, 7 Jun 2007, Prof Brian Ripley wrote: On Thu, 7 Jun 2007, Douglas Bates wrote: On 6/6/07, Aniko Szabo [EMAIL PROTECTED] wrote: Thanks to everybody who responded to my question. asInteger(coerceVector(x,INTSXP)) indeed does what I need. I guess there is a lot I don't understand about type coercion, as I would not have expected it to work. It is better to use asInteger(x) which will do the coercion if necessary. When you do the coercion yourself you should PROTECT the result then UNPROTECT it. Calling asInteger directly avoids this overhead without the risk of losing data in a garbage collection. asInteger can accomplish this because only the first element of the SEXP x is converted to an integer. I have to say I am puzzled. IntegerFromString works on a CHARSXP, and furthermore does not check its argument (which is one reason why it is no longer even exposed). AFAICS, coerceVector(x,INTSXP) will not accept a CHARSXP, but it will accept a STRSXP. (The same for asInteger.) I should have added 'The same for asInteger in R-devel'. I forgot to check R 2.5.0 (and suspect others did the same). So two ways to do this for vector 'x' are asInteger(x) INTEGER(coerceVector(x,INTSXP))[0] provided in the second case you know 'x' has length at least 1. But the first is both safer and more efficient. If you really have a CHARSXP, then you are not really supposed to work with 'bare' CHARSXPs unless you know what you are doing (in which case you don't need to ask ...). Aniko -Original Message- From: Seth Falcon [mailto:[EMAIL PROTECTED] Sent: Tuesday, June 05, 2007 11:24 PM To: Aniko Szabo Cc: r-devel@r-project.org Subject: Re: [Rd] missing IntegerFromString() Hi Aniko, Aniko Szabo [EMAIL PROTECTED] writes: I have created a DLL not so long ago using C code. My code used the IntegerFromString() function that used to be exported in the Rinternals.h header file (and thus easily accessible). Recently I upgraded to R 2.5.0 and my DLL stopped working. I see that the IntegerFromString() function is not exported in any of the header files in the RHOME\include directory. Is it possible for me to use it without installing all R source files? I can see that the function is in coerce.c, however it #includes other stuff that I don't have and I am afraid to mess things about by doing things I don't understand. Or perhaps there is another function that is intended to be used instead? I think you want asInteger (which calls IntegerFromString). This is in RHOME/include/Rinternals.h Best Wishes, + seth PS: Nice to see you again :-) -- Seth Falcon | Computational Biology | Fred Hutchinson Cancer Research Center http://bioconductor.org __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel -- Brian D. Ripley, [EMAIL PROTECTED] 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, UKFax: +44 1865 272595 __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
[Rd] missing IntegerFromString()
I have created a DLL not so long ago using C code. My code used the IntegerFromString() function that used to be exported in the Rinternals.h header file (and thus easily accessible). Recently I upgraded to R 2.5.0 and my DLL stopped working. I see that the IntegerFromString() function is not exported in any of the header files in the RHOME\include directory. Is it possible for me to use it without installing all R source files? I can see that the function is in coerce.c, however it #includes other stuff that I don't have and I am afraid to mess things about by doing things I don't understand. Or perhaps there is another function that is intended to be used instead? Thanks, Aniko __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel