R 是否支持间接变量扩展或变量替换?
Does R support indirect variable expansion or variable substitution?
在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 循环找到的每个建筑物命名。圆周率、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 中是否可行。
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()
、and/or parse
,但通常麻烦得不偿失。
函数 1) expression
、quote
和 bquote
和 2) eval
可能就是您要找的东西(如果我理解正确的话,是某种间接寻址) ).
在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 循环找到的每个建筑物命名。圆周率、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 中是否可行。
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()
、and/or parse
,但通常麻烦得不偿失。
函数 1) expression
、quote
和 bquote
和 2) eval
可能就是您要找的东西(如果我理解正确的话,是某种间接寻址) ).