Re: [Rd] API for converting LANGSXP to LISTSXP?
In this case, Rcpp was internally converting (already-existing) LISTSXPs to LANGSXPs using SET_TYPEOF in some places; the goal was to allow Rcpp to continue doing this without using SET_TYPEOF just to preserve existing behavior in an API-compliant way. I ended up doing exactly what you suggested; thanks. On Sat, Jul 6, 2024 at 8:09 PM Ivan Krylov wrote: > > On Fri, 5 Jul 2024 15:27:50 +0800 > Kevin Ushey wrote: > > > A common idiom in the R sources is to convert objects between LANGSXP > > and LISTSXP by using SET_TYPEOF. However, this is soon going to be > > disallowed in packages. > > Would you mind providing an example where a package needs to take an > existing LISTSXP and convert it to a LANGSXP (or vice versa)? I think > that Luke Tierney intended to replace the uses of > SET_TYPEOF(allocList(...), LANGSXP) with allocLang(...). > > At least it's easy to manually convert between the two by replacing the > head of the list using LCONS(CAR(list), CDR(list)) or CONS(CAR(lang), > CDR(lang)): in a call, the rest of the arguments are ordinary LISTSXPs. > > -- > Best regards, > Ivan __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] API for converting LANGSXP to LISTSXP?
On Fri, 5 Jul 2024 15:27:50 +0800 Kevin Ushey wrote: > A common idiom in the R sources is to convert objects between LANGSXP > and LISTSXP by using SET_TYPEOF. However, this is soon going to be > disallowed in packages. Would you mind providing an example where a package needs to take an existing LISTSXP and convert it to a LANGSXP (or vice versa)? I think that Luke Tierney intended to replace the uses of SET_TYPEOF(allocList(...), LANGSXP) with allocLang(...). At least it's easy to manually convert between the two by replacing the head of the list using LCONS(CAR(list), CDR(list)) or CONS(CAR(lang), CDR(lang)): in a call, the rest of the arguments are ordinary LISTSXPs. -- Best regards, Ivan __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
[Rd] API for converting LANGSXP to LISTSXP?
Hi, A common idiom in the R sources is to convert objects between LANGSXP and LISTSXP by using SET_TYPEOF. However, this is soon going to be disallowed in packages. From what I can see, there isn't currently a direct way to convert between these two object types using the available API. At the R level, one can convert calls to pairlists with: > as.call(pairlist(as.symbol("rnorm"), 42)) rnorm(42) However, the reverse is not possible: > as.pairlist(call("rnorm", 42)) Error in as.pairlist(call("rnorm", 42)) : 'language' object cannot be coerced to type 'pairlist' One can do such a conversion via conversion to e.g. an intermediate R list (VECSXP), but that seems wasteful. Would it make sense to permit this coercion? Or, is there some other relevant API I'm missing? For completeness, Rf_coerceVector() also emits the same error above since it uses the same code path. Thanks, Kevin __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel