如何使用替换功能创建自定义分配?

时间:2011-09-22 05:27:27

标签: r

我已经定义了一个名为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<-等函数?

2 个答案:

答案 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)通话也永远无法评估您的需求到。

抱歉让你失望