'Assign multiple objects to .GlobalEnv from within a function

A post on here a day back has me wondering how to assign values to multiple objects in the global environment from within a function. This is my attempt using lapply (assign may be safer than <<- but I have never actually used it and am not familiar with it).

#fake data set
df <- data.frame(
  x.2=rnorm(25),
  y.2=rnorm(25),
  g=rep(factor(LETTERS[1:5]), 5)
)

#split it into a list of data frames
LIST <- split(df, df$g)

#pre-allot 5 objects in R with class data.frame()
V <- W <- X <- Y <- Z <- data.frame()

#attempt to assign the data frames in the LIST to the objects just created
lapply(seq_along(LIST), function(x) c(V, W, X, Y, Z)[x] <<- LIST[[x]])

Please feel free to shorten any/all parts of my code to make this work (or work better/faster).



Solution 1:[1]

If you have a list of object names and file paths you can also use mapply:

object_names <- c("df_1", "df_2", "df_3")
file_paths   <- list.files({path}, pattern = ".csv", full.names = T)
    
mapply(function(df_name, file) 
           assign(df_name, read.csv(file), envir=.GlobalEnv),
       object_names,
       file_paths)
  • I used list.files() to construct a vector of all the .csv files in a specific directory. But file_paths could be written or constructed in any way.
  • If the files you want to read in are in the current working directory, then file_paths could be replaced with a character vector of file names.
  • In the code above, you need to replace {path} with a string of the desired directory's path.

Solution 2:[2]

This demonstrates how to split out a nested dataframe into objects in the global environment with tidyverse functions:

library(tidyverse)
library(palmerpenguins)

penguins %>% 
  group_nest(species) %>% 
  deframe() %>% 
  list2env(.GlobalEnv)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Danielle
Solution 2 Conor