【发布时间】:2012-03-22 19:48:06
【问题描述】:
我想知道是否可以在 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 号。我使用其他人提供的信息将指定的组放在一起。
例如,我会得到一组 id 编号,例如:part-1 = 102263、102338、202236、302342、902273、102337、402233。
所以,第 1 部分有七个组,每个组有几个元素。
我在合并中使用 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))
上面的过程重复了很多很多次。
我知道我可以为所有我要收集的集合执行此操作,但我认为我可以将选择过程包装到一个函数中。唯一会改变的是零件编号(part-1、part-2 等)和被选中的组。
【问题讨论】:
-
这是一个合理的问题,但我也会对您正在尝试做的事情的更多细节感兴趣,以便我们可以建议更多的 R 惯用方式来做这件事。正如答案所暗示的那样,这些类似宏观的方法在 R 中已被弃用,部分原因是出于美学原因,但也因为(如下所示)它们往往很脆弱。我不能立即指出它们失败的情况,尽管一旦你开始嵌套对函数的调用,正确地执行这些方法就会变得很棘手。
-
@BenBolker 针对计划目标进行的编辑。
-
现在没时间破解这个问题,但是编辑非常有用(我已经给了+1,所以我不能再...)我对你的代码有点困惑--
id.part.1在你做任何事情之前被bank.names覆盖?那是错字吗?nrow(id.part.1)将是NULL...(这就是 reproducible 示例很好的原因!例如,您可以dput()几行较大的数据框...如果您只是想要选择对应于 part1 集的行,那么subset(all.possible.elements.bank,bank.id %in% id.part.1)应该这样做... -
@blueandgrey:编辑看起来像是要把这个问题引向一个完全不同的方向;我建议改为打开一个新问题并在此处留下一个链接。
-
如果您将零件 ID 字符串存储在 list 中,则创建一个调用
subset()并返回相关行的函数,然后将其放入lapply(),将为您提供相关块的列表。