I have defined a function called once as follows:
once <- function(x, value) {
xname <- deparse(substitute(x))
if(!exists(xname)) {
assign(xname, value, env=parent.frame())
}
invisible()
}
The idea is that value is time-consuming to evaluate, and I only want to assign it to x the first time I run a script.
> z
Error: object 'z' not found
> once(z, 3)
> z
[1] 3
I’d really like the usage to be once(x) <- value rather than once(x, value), but if I write a function once<- it gets upset that the variable doesn’t exist:
> once(z) <- 3
Error in once(z) <- 3 : object 'z' not found
Does anyone have a way around this?
ps: is there a name to describe functions like once<- or in general f<-?
As per item 3.4.4 in the R Language Reference, something like a names replacement is evaluated like this:
This is bad news for your requirement, because the assignment will fail on the first line (as x is not found), and even if it would work, your
deparse(substitute)call will never evaluate to what you want it to.Sorry to disappoint you