[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