【问题标题】:Does R support indirect variable expansion or variable substitution?R 是否支持间接变量扩展或变量替换?
【发布时间】:2015-08-25 00:51:07
【问题描述】:

在 bash 中,可以使用感叹号将变量的值用作变量。见explanation here。这称为变量间接扩展。这可用于在代码中使用另一个变量来命名新变量。我想知道这是否可以在 R 语言中完成。

例如,假设我想为位于公司每个建筑物的员工创建一个数据框。

head(talent_by_building)

   employee building
1    345618 Pi
2    195871 E
3    247274 Pi
4    929771 Pi
5    873096 E
6    665857 E
7    791656 E
8    133673 E
9    574058 C
10   208041 C
11   402100 C
12   167792 C
13   156971 C

让“♠building”成为我想要间接扩展的变量。所以我想使用建筑物名称作为该建筑物名称的新变量。我在这里使用 ♠ 字符,因为使用 ! (因为它在 bash 中的变量前面使用)引起了一些混乱。

completed_list <- c("") #Clear out vector
for(building in talent_by_building$building){

  if(!(building %in% completed_list)){
    ♠building<-talent_by_building[talent_by_building$building %in% building,]
  }
  append(completed_list,building)
}

如果这在 R 中是可能的,那么预期的输出将是创建三个新的数据框,这些数据框为 for 循环找到的每个建筑物命名。 Pi、E 和 C:

head(pi)

   employee building
1    345618 Pi
2    247274 Pi
3    929771 Pi


head(E)

   employee building
1    195871 E
2    873096 E
3    665857 E
4    791656 E
5    133673 E

head(C)

   employee building
1   574058 C
2   208041 C
3   402100 C
4   167792 C
5   156971 C

有没有办法使用建筑物名称作为新值的名称?所以代替 ♠building 变量的值将被替换为变量名。我可以在 bash 中做到这一点,我想知道这在 R 中是否可行。

【问题讨论】:

  • 如果您使输入可重现会更容易,即。使用dput 或类似的东西,以便我们可以轻松地将复制粘贴到 R 中并准备好您的示例
  • 我不明白这里想要的输出。请定义所有变量以解决您的问题reproducible。我想你可能只想要x[[building]]&lt;-?但我不知道x 应该在这里。与其要求翻译语法,不如专注于描述你想在 R 中解决的问题。
  • 对不起,我已经用 ♠building 替换了 x[building]。这是为了象征我正在寻找的 R 功能。我不是在寻找对我的语法的更正。我也不能提供我所有的代码,因为它是公司代码,并且工作代码与问题无关。我不是在寻找正确的代码。我正在寻找我在 bash 中使用的功能的 R 等效项。

标签: r indirection variable-substitution


【解决方案1】:

tl;dr 不,没有用于变量替换的简写语法。 答案稍长:很容易得到你想要的输出。不过,如果您要在很短的时间内使用 R,那么学习一些 R 习语可能是值得的。

构造示例数据:

talent_by_building <-  read.table(header=TRUE,text=
"employee building
345618 Pi
195871 E
247274 Pi
929771 Pi
873096 E
665857 E
791656 E
133673 E
574058 C
208041 C
402100 C
167792 C
156971 C")

先将数据按building拆分:

ss <- split(talent_by_building,talent_by_building$building)

处理这些数据的惯用 R 方法是将它们留在列表中,而不是创建新变量来弄乱全局工作区。但如果你想:

for (i in names(ss)) {
    assign(i,ss[[i]])
}
ls()

更直接的代码翻译:

BUILDING <- "Pi"
assign(BUILDING,subset(talent_by_building,building==BUILDING))

如果您想做除作业以外的事情,您可以使用eval()substitute() 和/或parse,但通常麻烦多于其价值。

【讨论】:

  • 所以我猜你是说 lang R 的语法中没有这个功能?
  • list2env(ss, .GlobalEnv)assign 循环更方便。
【解决方案2】:

函数 1) expressionquotebquote 和 2) eval 可能是您正在寻找的(如果我理解正确的话,是某种间接)。

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2011-10-17
    • 2014-02-11
    • 2014-02-04
    • 2015-08-08
    • 2020-09-06
    相关资源
    最近更新 更多