如何将函数调用中指定的值用作“变量”

时间:2012-03-22 19:48:06

标签: r function macros sas

我想知道在R中是否可以使用在函数调用中声明的值作为函数本身的“变量”部分,类似于SAS IML中可用的功能。

考虑到这样的事情:

put.together <- function(suffix, numbers) {
new.suffix <<- as.data.frame(numbers)
return(new.suffix)
}

x <- c(seq(1000,1012, 1))
put.together(part.a, x)

new.part.a   ##### does not exist!!

new.suffix   ##### does exist

在编写时,该函数返回一个名为new.suffix的数据帧,因为它应该是我要求它做的。

我想获得一个名为new.part.a的数据帧。


编辑:要求提供有关分析目的的其他信息

问题的目的是生成将被发送到另一个函数进行分析的数据帧。

存在一个数据库,其中元素按编号分组,其他人组织这些组 成为一个有意义的集。

每个组都有一个ID号。我使用其他人提供的信息将这些组放在一起,因为它们已被指定。

例如,我将获得一组身份证号码:part-1 = 102263,102338,202236,302342,902273,102337,402233。

因此,第1部分有7个组,每个组有几个元素。

我在合并中使用id号码,以便只从大数据库中提取感兴趣的组。

以下是我对一套的内容:

### all.possible.elements.bank <- .csv file from large database ###

id.part.1 <- as.data.frame(c(102263, 102338, 202236, 302342, 902273, 102337, 402233))
bank.names <- c("bank.id")
colnames(id.part.1) <- bank.names
part.sort <- matrix(seq(1,nrow(id.part.1),1)) 
sort.part.1 <- cbind(id.part.1, part.sort)

final.part.1 <- as.data.frame(merge(sort.part.1, all.possible.elements.bank, 
by="bank.id", all.x=TRUE))

上述过程重复了很多次。

我知道我可以为所有收集到的集合执行此操作,但我认为我可以将选择过程包装到函数中。唯一可以改变的是部件号(第1部分,第2部分等等)和被选中的组。

2 个答案:

答案 0 :(得分:4)

可以使用assign函数(可能还有deparsesubstitute),但强烈建议您不要这样做。为什么不能只返回数据框并调用函数,如:

new.part.a <- put.together(x)

哪种方法通常更好。

如果您真的想要在全球环境中更改内容,那么您可能需要一个宏,请参阅defmacro包中的gtools函数,最重要的是阅读帮助中的参考文档中的文档页。

答案 1 :(得分:1)

这很少是你想要做的事情......在功能环境中分配东西会让你遇到各种各样的麻烦。

但是,您可以使用assign

执行此操作
put.together <- function(suffix, numbers) {
   assign(paste('new',
                deparse(substitute(suffix)),
                sep='.'),
          as.data.frame(numbers),
          envir=parent.env(environment()))
}

put.together(part.a, 1:20)

但是像Greg说的那样,它通常没有必要,如果使用不正确,总是很危险。