【问题标题】:How to use a value that is specified in a function call as a "variable"如何将函数调用中指定的值用作“变量”
【发布时间】: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(),将为您提供相关块的列表。

标签: r function macros sas


【解决方案1】:

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

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

这通常是更好的方法。

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

【讨论】:

  • 这就是提问的动机。我已经写了很多这样的陈述(就像你的回答一样),并且想知道是否有办法清理它们。我想简短的回答是否定的......
【解决方案2】:

这很少是你应该想要做的事情......分配给函数环境之外的东西会给你带来各种各样的麻烦。

但是,您可以使用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)

但就像格雷格说的,它通常没有必要,如果使用不当总是很危险的。

【讨论】:

  • 要回答 OP 提出的确切问题,我认为您想要 deparse(substitute(suffix))(如 @GregSnow 所暗示的那样)而不是 suffix。此外,您可以使用 parent.env() 而不是 .GlobalEnv(尽管如果 OP 尝试在嵌套环境中执行此类操作,他们可能会遇到麻烦)。
  • 感谢大家的cmets。看起来它可能比它的价值更麻烦......
猜你喜欢
  • 2013-12-28
  • 2019-08-03
  • 2019-12-06
  • 1970-01-01
  • 2013-12-23
  • 2023-04-11
  • 2021-12-21
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多