[Rd] Convert STRSXP or INTSXP to factor
Gabriel Becker
g@bembecker @end|ng |rom gm@||@com
Mon Jul 15 22:29:28 CEST 2019
Hi Morgan,
So if the goal is output identical to calling factor, one thing youc an
do is construct and evaluate a call to the R-level factor function. That
would work and be guaranteed to meet your requirement.
The factor function is implemented with R code, without even any direct
calls down to C code, so there isn't any C level functionality already
there that you could try to hit directly.
If you really really needed to write it using only C (and not hitting the R
evaluator), I suppose you could. You'd need to do the following, I think:
1. Loop through the values to determine the array of levels vector,
equivalent to a call to unique(x) at the R level. I don't know if there
are any public API functions that will do this for you, a quick grep
through the header files suggests there are not.
2. Allocate the ouptut INTSXP and determine the underlying integer value
for each factor element. Equivalent to a match(x, levels) in R (x has
already been converted to character at this point in the R function).
Getting this to be performant would probably be annoying but is doable
(e.g., via a hash table or some such)
3. Do classgets on the the output vector to make it a factor (this will
set the object bit so you don't need to do that separate)
4. do setAttrib on the output vector to set the levels attribute (which
now needs to be a STRSXP rather than, e.g., an array of const char*)
5. Return the output vector
Personally, unless there was a really compelling reason not to, I'd just do
the create and evaluate an R-level call thing instead.
Best,
~G
On Mon, Jul 15, 2019 at 3:25 AM Morgan Morgan <morgan.emailbox using gmail.com>
wrote:
> Hi,
>
> Using the R C PAI, is there a way to convert to convert STRSXP or INTSXP to
> factor.
>
> The idea would be to do in C something similar to the "factor" function
> (example below):
>
> > letters[1:5]
> # [1] "a" "b" "c" "d" "e"
>
> > factor(letters[1:5])
> # [1] a b c d e
> # Levels: a b c d e
>
> There is the function setAttrib the levels of a SXP however when returned
> to R the object is of type character not factor. Ideally what i would like
> to return from the C function is the same output as above when the input is
> of type character.
>
> Please let me if you need more informations.
> Thank you
> Best regards
> Morgan
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
[[alternative HTML version deleted]]
More information about the R-devel
mailing list