函数是否可以知道其赋值目标的名称?

时间:2013-11-18 04:39:13

标签: r assign

这可能是不可能的但是让我试试......

是否可以编写此功能?

Foo<-function(n){
     X=runif(n)
     write.csv(X,file=paste([the name of the assignment target],".csv",sep="")
    }

所以当我这样做时

ABC<-Foo(10)

它生成10个随机数,并将它们存储到R对象ABC并写入一个名为“ABC.csv”的csv文件?

我知道你可以这样做:

Foo2<-function(n,name){
        X=runif(n)
        write.csv(X,file=paste(name,".csv",sep=""))
        assign(name,X,envir=.GlobalEnv)
      }
Foo2(10,"ABC")

但是我想使用箭头运算符&lt; - 因为它是R中的常用语法。所以Foo2真的不完美。当然还有

ABC<-Foo2(10,"ABC")

没有意义,因为它意味着输入两次名称。

2 个答案:

答案 0 :(得分:4)

如果我们稍微改变语法,我们就可以做到。首先定义:

Random <- structure(NA,class="Random")
"$<-.Random" <- function(x, name, value) {
    X <- runif(value)
    write.csv(X, file = paste0(name, ".csv"))
    assign(name, X, parent.frame())
    invisible(x)
}

这是这样使用的:

Random$abc <- 3

之后abc将是生成数字的向量,并且将写出abc.csv文件。

答案 1 :(得分:3)

我认为你不能覆盖<-,但你可以制作自己的二元函数%<-%

Foo <- function(n){
    runif(n)
}

`%<-%` <- function(x, y){
    xname <- as.character(substitute(x))
    assign(xname, y, envir = .GlobalEnv)
    write.csv(y, file = paste0(xname, ".csv"))
}

和一个例子

> dir()
character(0)
> ls()
[1] "%<-%" "Foo" 
> x %<-% Foo(3)
> x
[1] 0.1838146 0.6785800 0.3758954
> read.csv("x.csv")
  X         x
1 1 0.1838146
2 2 0.6785800
3 3 0.3758954