R是否支持间接变量扩展或变量替换?

时间:2015-06-10 00:11:05

标签: r indirection variable-subsitution

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

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

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

让" ♠建设"是我想要间接扩展的变量。所以我想使用建筑物名称作为该建筑物名称的新变量。我在这里使用♠角色因为使用! (因为它在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。

2 个答案:

答案 0 :(得分:3)

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,但这通常比它的价值更麻烦。

答案 1 :(得分:0)

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