我已经定义了一个名为once
的函数,如下所示:
once <- function(x, value) {
xname <- deparse(substitute(x))
if(!exists(xname)) {
assign(xname, value, env=parent.frame())
}
invisible()
}
我的想法是value
评估非常耗时,我只想在第一次运行脚本时将其分配给x
。
> z
Error: object 'z' not found
> once(z, 3)
> z
[1] 3
我真的希望使用once(x) <- value
而不是once(x, value)
,但是如果我编写一个函数once<-
,那么变量不存在就会感到不安:
> once(z) <- 3
Error in once(z) <- 3 : object 'z' not found
有没有人能解决这个问题?
ps:是否有名称来描述once<-
或一般f<-
等函数?
答案 0 :(得分:7)
如果您愿意稍微修改您的要求以使用方括号而不是括号,那么您可以这样做:
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
答案 1 :(得分:6)
根据R语言参考中的项3.4.4,像名称替换这样的内容将按如下方式进行评估:
`*tmp*` <- x
x <- "names<-"(`*tmp*`, value=c("a","b"))
rm(`*tmp*`)
这对您的要求来说是个坏消息,因为第一行的分配失败(因为找不到x),即使它可以正常工作,您的deparse(substitute)
通话也永远无法评估您的需求到。
抱歉让你失望