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

pet*_*ete 4 r

我定义了一个名为的函数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<-

G. *_*eck 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
Run Code Online (Sandbox Code Playgroud)


Nic*_*bbe 6

根据R语言参考中的项目3.4.4,像名称替换这样的东西被评估如下:

 `*tmp*` <- x
 x <- "names<-"(`*tmp*`, value=c("a","b"))
 rm(`*tmp*`)
Run Code Online (Sandbox Code Playgroud)

这对您的要求来说是个坏消息,因为分配在第一行失败(因为找不到x),即使它可以正常工作,您的deparse(substitute)通话也永远不会评估您想要它.

抱歉让你失望