简体   繁体   中英

Saved RData object doesn't appear in environment after load() call

If that helps, this is related to this question here where I iteratively create RData objects How to save R data object that has been created using assign()?

The following creates some variables and each variable would be assign a random value. After the variable has been assigned a value, I saved them as a unique RData object.

Then, I destroy the variables and try to reload the RData objects back to the environment.

However, for some reasons the RData objects are not loaded to the environment and the load() function call doesn't return any error as well.

set.seed(1990)
for (l in LETTERS) {
  print(l)
  SKU <- paste0('SKU_',l)
  assign(paste0('arima_',SKU), runif(1,1,10)) 
  # check assignment
  print(get(paste0('arima_',SKU)))
  # save RData
  paste0('arima_',SKU) %>% save(file = paste0('arima_',SKU,'.RData'))
}

# remove variables
rm(list=ls())

# reload variables
allRData <- fs::dir_ls(path = '.', regexp = 'arima_')
allRData
# arima_SKU_A.RData arima_SKU_B.RData arima_SKU_C.RData arima_SKU_D.RData arima_SKU_E.RData 
# arima_SKU_F.RData arima_SKU_G.RData arima_SKU_H.RData arima_SKU_I.RData arima_SKU_J.RData 
# arima_SKU_K.RData arima_SKU_L.RData arima_SKU_M.RData arima_SKU_N.RData arima_SKU_O.RData 
# arima_SKU_P.RData arima_SKU_Q.RData arima_SKU_R.RData arima_SKU_S.RData arima_SKU_T.RData 
# arima_SKU_U.RData arima_SKU_V.RData arima_SKU_W.RData arima_SKU_X.RData arima_SKU_Y.RData 
# arima_SKU_Z.RData

# load
lapply(allRData,load,.GlobalEnv)

> lapply(allRData,load,.GlobalEnv)
$arima_SKU_A.RData
[1] "."

$arima_SKU_B.RData
[1] "."

$arima_SKU_C.RData
[1] "."

$arima_SKU_D.RData
[1] "."

$arima_SKU_E.RData
[1] "."

$arima_SKU_F.RData
[1] "."

$arima_SKU_G.RData
[1] "."

$arima_SKU_H.RData
[1] "."

$arima_SKU_I.RData
[1] "."

$arima_SKU_J.RData
[1] "."

$arima_SKU_K.RData
[1] "."

$arima_SKU_L.RData
[1] "."

$arima_SKU_M.RData
[1] "."

$arima_SKU_N.RData
[1] "."

$arima_SKU_O.RData
[1] "."

$arima_SKU_P.RData
[1] "."

$arima_SKU_Q.RData
[1] "."

$arima_SKU_R.RData
[1] "."

$arima_SKU_S.RData
[1] "."

$arima_SKU_T.RData
[1] "."

$arima_SKU_U.RData
[1] "."

$arima_SKU_V.RData
[1] "."

$arima_SKU_W.RData
[1] "."

$arima_SKU_X.RData
[1] "."

$arima_SKU_Y.RData
[1] "."

$arima_SKU_Z.RData
[1] "."


The problem is the piping operator is changing the call from

save("arima_SKU_A", file = "arima_A.RData'))

to something more like

. <- "arima_SKU_A"; save(., file = "arima_A.RData'))

because . is the variable it uses to pass along values. So technically in each of those Rdata files, you are storing a variable name . with a value that's equal to the intended name of the dataset. This is mostly a quirk of the non-standard evaluation that save() does for its unnamed parameters.

Since you want to pass along variable names as strings rather than symbols, it's safer to use save(list=) parameter and explicitly place the . yourself.

paste0('arima_',SKU) %>% save(list=., file = paste0('arima_',SKU,'.RData'))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM