In bash one can use an exclamation mark to use a variable's value as a variable. See explanation here. This is known as variable indirect expansion. This can be used to used to name a new variable using another variable in your code. I was wondering if this could be done in R lang.
For example, lets say I want to create a data frame of employees located at each of a companies' buildings.
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
And let "♠building" be the variable I want to indirectly expand. So I want to use the building name as a new variable of that building's name. I am using a ♠ character here because using ! (as it is used infront of a variable in bash) was causing some confusion.
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)
}
If this was possible in R, the expected output would be the creation of three new data frames named for each of the buildings the for loop found. Pi,E,and 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
Is there a way to use the building name as the name of the new value? So in place of ♠building the value of the variable would be substituted as the variable name. I can do this in bash and was wondering if this was possible in R.
tl;dr no, there is no short-hand syntax for variable substitution. Slightly longer answer: it's pretty easy to get your desired output. If you're going to be working with R for more than a very short time, it's probably worth learning some R idioms, though.
Construct example data:
First split the data by
building
:The idiomatic R way to deal with these data would be to leave them inside the list rather than creating new variables to clutter up the global workspace. But if you want to:
A more direct translation of your code:
If you want to do something other than assignment you can use
eval()
,substitute()
, and/orparse
, but it's usually more trouble than it's worth.