[R] Dynamically create a (convenience) function in a package
Martin Maechler
m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Mon Oct 30 14:26:50 CET 2023
>>>>> Iris Simmons
>>>>> on Mon, 30 Oct 2023 06:37:04 -0400 writes:
> If you don't know the name of the attributes in advance,
> how can you know the function name to be able to call it?
> This seems like a very flawed approach.
> Also, I would discourage the use of eval(parse(text = )),
> it's almost always not the right way to do what you want
> to do. In your case,
> eval(bquote(function(x) attr(x, .(n))))
> would be better.
Indeed! Thank you, Iris!
... as an old timer, I'd like to raise
R> fortunes::fortune("eval(parse")
Personally I have never regretted trying not to underestimate my own future
stupidity.
-- Greg Snow (explaining why eval(parse(...)) is often suboptimal, answering
a question triggered by the infamous fortune(106))
R-help (January 2007)
R> fortunes::fortune(106)
If the answer is parse() you should usually rethink the question.
-- Thomas Lumley
R-help (February 2005)
R>
Best, Martin
> On Mon, Oct 30, 2023, 06:28 Sigbert Klinke
> <sigbert using wiwi.hu-berlin.de> wrote:
>> Hi,
>>
>> n a package, I have a data object with attributes, and I
>> want to dynamically create a convenience function to
>> access those attributes. This way, instead of using
>> attr(x, "number"), I would like to use number(x).
>>
>>
>>
>> Because I don't know in advance which attributes the data
>> object may have, I've used the following algorithm:
>>
>> x <- structure(pi, number=exp(1))
>>
>> a <- attributes(x)
>>
>> for (n in names(a)) {
>>
>> if (!exists(n, mode="function")) {
>>
>> f <- eval(parse(text=sprintf("function(x) { attr(x, '%s')
>> } ", n)))
>>
>>
>> assign(n, f, envir=.GlobalEnv)
>>
>> }
>>
>> }
>>
>> number(x)
>>
>> However, I believe modifying the global environment with
>> this is not allowed by CRAN for a package. Is there a way
>> to implement such functionality?
>>
>> Thanks Sigbert
>>
>> --
>> https://hu.berlin/sk https://www.stat.de/faqs
>> https://hu.berlin/mmstat https://hu.berlin/mmstat-ar
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and
>> more, see https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html and provide
>> commented, minimal, self-contained, reproducible code.
>>
> [[alternative HTML version deleted]]
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and
> more, see https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html and provide
> commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list