我定义了一个名为的函数once如下:
once <- function(x, value) {
xname <- deparse(substitute(x))
if(!exists(xname)) {
assign(xname, value, env=parent.frame())
}
invisible()
}
Run Code Online (Sandbox Code Playgroud)
这个想法是value评估时间很长,我只想x在第一次运行脚本时将其分配.
> z
Error: object 'z' not found
> once(z, 3)
> z
[1] 3
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢使用once(x) <- value而不是once(x, value),但是如果我编写一个函数once<-,那么变量就不存在了:
> once(z) <- 3
Error in once(z) <- 3 : object 'z' not found
Run Code Online (Sandbox Code Playgroud)
有没有人有办法解决这个问题?
ps:是否有一个名称来描述类似once<-或一般的功能f<-?
如果您愿意稍微修改您的要求以使用方括号而不是括号,那么您可以这样做:
once <- structure(NA, class = "once")
"[<-.once" <- function(once, x, value) {
xname <- deparse(substitute(x))
pf <- parent.frame()
if (!exists(xname, pf)) assign(xname, value, pf)
once
}
# assigns 3 to x (assuming x does not currently exist)
once[x] <- 3
x # 3
# skips assignment (since x now exists)
once[x] <- 4
x # 3
Run Code Online (Sandbox Code Playgroud)
根据R语言参考中的项目3.4.4,像名称替换这样的东西被评估如下:
`*tmp*` <- x
x <- "names<-"(`*tmp*`, value=c("a","b"))
rm(`*tmp*`)
Run Code Online (Sandbox Code Playgroud)
这对您的要求来说是个坏消息,因为分配在第一行失败(因为找不到x),即使它可以正常工作,您的deparse(substitute)通话也永远不会评估您想要它.
抱歉让你失望