[R] How to modify object's code living in some environment?

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Mon Dec 27 18:28:11 CET 2021


On 27/12/2021 8:25 a.m., Duncan Murdoch wrote:
> On 27/12/2021 8:06 a.m., Grzegorz Smoliński wrote:
>> Hi,
>>
>> I know it is possible to find the environment in which some object
>> lives using the 'environment()' function and the name of this object,
>> but how to modify code of this object after this? Below is MRE:
> 
> You are misunderstanding the relation between environments and
> functions.  However, your understanding is also being messed up by a bug
> in R, so it's not entirely your fault.

Actually this isn't a bug in R, it is working as documented.  For a 
detailed explanation, see the response to my bug report here: 
https://bugs.r-project.org/show_bug.cgi?id=18269 .

For a quick idea:  "complex assignments" are assignments where there is 
a complex expression on the left hand side, e.g.

   environment(test)$test <- ...

The way these are documented to work (in the R Language Definition 
manual) makes intuitive sense when you are working with regular R 
objects, but environments are "mutable" objects:  assigning them to a 
new name doesn't make a new copy, just a new reference.  That causes the 
definition of the complex assignment above to work in an unintuitive way.

Conclusion:  you should avoid using calls like environment(f) on the 
left hand side of assignments, especially as part of a larger 
expression.  Break up the statement into steps like I did below:

>     e <- environment(test)
>     e$test <- eval(parse(text = "function() 2"))

The same advice would apply to a function that returned an R6 object or 
a mutable object from the methods package (which are really environments 
in disguise), as well as some other exotic objects.

Duncan Murdoch



More information about the R-help mailing list