Re: [Rd] missing IntegerFromString()

From: Aniko Szabo <aszabo_at_hpi.mcw.edu>
Date: Thu, 07 Jun 2007 14:47:47 -0500


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:ripley_at_stats.ox.ac.uk] 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 <aszabo_at_hpi.mcw.edu> 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:sfalcon_at_fhcrc.org]
>>>>> Sent: Tuesday, June 05, 2007 11:24 PM
>>>>> To: Aniko Szabo
>>>>> Cc: r-devel_at_r-project.org
>>>>> Subject: Re: [Rd] missing IntegerFromString()
>>>>>
>>>>> Hi Aniko,
>>>>>
>>>>> "Aniko Szabo" <aszabo_at_hpi.mcw.edu> 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_at_r-project.org mailing list
>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>>
>>>>
>>>> ______________________________________________
>>>> R-devel_at_r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>
>>>>
>>>
>>> ______________________________________________
>>> R-devel_at_r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>
>> --
>> Brian D. Ripley, ripley_at_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
>>
>

-- 
Brian D. Ripley,                  ripley_at_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_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Fri 08 Jun 2007 - 06:21:08 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 08 Jun 2007 - 13:34:12 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.