Duncan Murdoch
2023-Aug-27 16:02 UTC
[Rd] Calling a replacement function in a custom environment
I think there isn't a way to make this work other than calling `is.na<-` explicitly: x <- b$`is.na<-`(x, TRUE) It seems like a reasonable suggestion to make b$is.na(x) <- TRUE work as long as b is an environment. If you wanted it to work when b was a list, it would be more problematic because of partial name matching. E.g. suppose b was a list containing functions partial(), partial<-(), and part<-(), and I call b$part(x) <- 1 what would be called? Duncan Murdoch On 27/08/2023 10:59 a.m., Konrad Rudolph wrote:> Hello all, > > I am wondering whether it?s at all possible to call a replacement function > in a custom environment. From my experiments this appears not to be the > case, and I am wondering whether that restriction is intentional. > > To wit, the following works: > > x = 1 > base::is.na(x) = TRUE > > However, the following fails: > > x = 1 > b = baseenv() > b$is.na(x) = TRUE > > The error message is "invalid function in complex assignment". Grepping the > R code for this error message reveals that this behaviour seems to be > hard-coded in function `applydefine` in src/main/eval.c: the function > explicitly checks for `::` and :::` and permits those assignments, but has > no equivalent treatment for `$`. > > Am I overlooking something to make this work? And if not ? unless there?s a > concrete reason against it, could it be considered to add support for this > syntax, i.e. for calling a replacement function by `$`-subsetting the > defining environment, as shown above? > > Cheers, > Konrad >
iuke-tier@ey m@iii@g oii uiow@@edu
2023-Aug-27 17:05 UTC
[Rd] [External] Re: Calling a replacement function in a custom environment
On Sun, 27 Aug 2023, Duncan Murdoch wrote:> I think there isn't a way to make this work other than calling `is.na<-` > explicitly: > > x <- b$`is.na<-`(x, TRUE) >Replacement functions are not intended to be called directly. Calling a replacement function directly may produce an error, or may just do the wrong thing in terms of mutation.> It seems like a reasonable suggestion to make > > b$is.na(x) <- TRUE > > work as long as b is an environment. >I do not think it is a reasonable suggestion. The reasons a::b and a:::b were made to work is that many users read these as a single symbol, not a call to a binary operator. So supporting this helped to reduce confusion. Allowing $<- to "work" on environments was probably a mistake since environments behave differently with respect to duplication. Disallowing it entirely may be too disruptive at this point, but disallowing it in complex assignment expressions may be necessary to prevent mutations that should not happen. (There are open bug reports that boil down to this.) In any case, complicating the complex assignment code, which is already barely maintainable, would be a very bad idea. Best, luke> If you wanted it to work when b was a list, it would be more problematic > because of partial name matching. E.g. suppose b was a list containing > functions partial(), partial<-(), and part<-(), and I call > > b$part(x) <- 1 > > what would be called? > > Duncan Murdoch > > On 27/08/2023 10:59 a.m., Konrad Rudolph wrote: >> Hello all, >> >> I am wondering whether it?s at all possible to call a replacement function >> in a custom environment. From my experiments this appears not to be the >> case, and I am wondering whether that restriction is intentional. >> >> To wit, the following works: >> >> x = 1 >> base::is.na(x) = TRUE >> >> However, the following fails: >> >> x = 1 >> b = baseenv() >> b$is.na(x) = TRUE >> >> The error message is "invalid function in complex assignment". Grepping the >> R code for this error message reveals that this behaviour seems to be >> hard-coded in function `applydefine` in src/main/eval.c: the function >> explicitly checks for `::` and :::` and permits those assignments, but has >> no equivalent treatment for `$`. >> >> Am I overlooking something to make this work? And if not ? unless there?s a >> concrete reason against it, could it be considered to add support for this >> syntax, i.e. for calling a replacement function by `$`-subsetting the >> defining environment, as shown above? >> >> Cheers, >> Konrad >> > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Luke Tierney Ralph E. Wareham Professor of Mathematical Sciences University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: luke-tierney at uiowa.edu Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu