[R] Assigning several lists to variables whose names are contained in other variables
Rui Barradas
ru|pb@rr@d@@ @end|ng |rom @@po@pt
Sat Apr 10 09:01:43 CEST 2021
Hello,
I believe that the point we are missing is that datatable$column stores
the *names* of the graphs, not the graph objects themselves. So in the
loop the objects must be retrieved with mget() or get().
First create a reproducible example.
library(tidygraph)
my_function <- function(g){
stopifnot(inherits(g, "igraph"))
g %>% mutate(centrality = centrality_pagerank())
}
MYSUBNET1 <- create_notable('bull')
iris_clust <- hclust(dist(iris[1:4]))
MYSUBNET2 <- as_tbl_graph(iris_clust)
MYSUBNET3 <- play_smallworld(1, 100, 3, 0.05)
datatable <- data.frame(column = paste0("MYSUBNET", 1:3))
Now apply the function above to each of the "tbl_graph" objects.
1. Get all objects and apply the function in one instruction. Then
assign the new names.
result <- lapply(mget(datatable$column, envir = .GlobalEnv), my_function)
names(result) <- paste("subnet", datatable$column, sep = "_")
2. Loop through the column with lapply, getting one object and applying
the function one at a time. Then assign the new names.
result2 <- lapply(datatable$column, function(net_name){
NET <- get(net_name, envir = .GlobalEnv)
my_function(NET)
})
names(result2) <- paste("subnet", datatable$column, sep = "_")
3. Loop through the column with a for loop, getting one object and
applying the function one at a time. Then assign the new names.
result3 <- vector("list", length = nrow(datatable))
for(i in seq_along(datatable$column)){
net_name <- datatable$column[i]
NET <- get(net_name, envir = .GlobalEnv)
result3[[i]] <- my_function(NET)
}
names(result3) <- paste("subnet", datatable$column, sep = "_")
4. Now check that all 3 solutions give the same result.
identical(result, result2)
#[1] TRUE
identical(result, result3)
#[1] TRUE
Is this it?
Rui Barradas
Às 17:23 de 09/04/21, Wolfgang Grond escreveu:
> As I wrote before, I calculate tbl_graph objects, which will be joined afterwards. Not too much, the number of graphs to calculate is in the range between 5 to 20.
>
> Further steps are not automated, because they depend on how the single graphs look like, and which of them will be joined.
>
> For this reason I thought it would be nice to have the single tbl_ graph objects stored in variables having the name of the graph.
>
> For this reason I tried to find a better solution instead of assigning each graph by hand:
>
> subnet_MYSUBNET <- my_function(MYSUBNET)
>
> To my understanding it is therefore neccessary to assign the result of the function to a variable whose name consists of a fixed string and the content of a further variable.
>
> That was the intention for me to ask.
>
> Am 9. April 2021 17:22:05 MESZ schrieb David Winsemius <dwinsemius using comcast.net>:
>>
>> On 4/9/21 5:21 AM, Wolfgang Grond wrote:
>>> Greg,
>>>
>>> here I get the error message:
>>>
>>> Error my_function(val) :
>>>
>>> cannot find function my_function.
>>
>> I'm guessing that you are following someone else's blog and have failed
>>
>> one of two things:
>>
>> - understand that what was meant by the author was that you were
>> assumed
>> to have a function in mind to use for a programming strategy being
>> illustrated
>>
>> - or you were copying and pasting only part of a blog and failed to
>> paste in the code from above where there was earlier code defining
>> `my_function`
>>
>>>
>>> Am 9. April 2021 12:35:40 MESZ schrieb Greg Minshall
>> <minshall using umich.edu>:
>>>> Wolfgang,
>>>>
>>>>> result <- assign(paste("subnet_", val, sep = "")
>>>>>
>>>>> result <- my_function(val)
>>>> i don't understand why you are twice assigning to =result=. also,
>> the
>>>> first assignment doesn't seem well formatted (t's missing a value?).
>>>>
>>>> did you mean something like
>>>>
>>>> : assign(paste("subnet_", val, sep = ""), my_function(val))
>>>>
>>>> (which i would think should work)?
>>>>
>>>> cheers, Greg
>>>>
>>>> ______________________________________________
>>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide
>>>> http://www.R-project.org/posting-guide.html
>>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>> -
>>> Numberland - Dr. Wolfgang Grond
>>> Diplomphysiker, TQM-Assessor (EFQM)
>>> Six Sigma Green Belt
>>> Ingenieurbüro / Engineering Consultancy
>>> Lohfeld 20, DE-95326 Kulmbach, Germany
>>> Phone: +49 9221 6919131
>>> Fax: +49 9221 6919156
>>> Mail: grond using numberland.com
>>> URL: http://www.numberland.com
>>> [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
More information about the R-help
mailing list