在调用load()之后,已保存的RData对象不会出现在环境中 [英] Saved RData object doesn't appear in environment after load() call

查看:446
本文介绍了在调用load()之后,已保存的RData对象不会出现在环境中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果有帮助,这与这里的问题有关,在这里我迭代创建RData对象
如何保存使用assign()创建的R数据对象?

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()?

以下内容创建了一些变量,并将为每个变量分配一个随机值。
给变量赋值后,我将它们保存为唯一的RData对象。

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.

然后,销毁变量,并尝试将RData对象重新加载到环境中

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

但是,由于某些原因,RData对象没有加载到环境中,并且load()函数调用也没有返回任何错误。

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'))

类似

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

因为是用于传递值的变量。因此,从技术上讲,在每个 Rdata 文件中,您都存储了一个变量名称,其值等于预期的值数据集的名称。这主要是 save()针对其未命名参数所做的非标准评估的怪癖。

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.

因为您希望传递沿着变量名(而不是符号)作为字符串而不是符号,使用 save(list =)参数并显式放置更为安全。

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'))

这篇关于在调用load()之后,已保存的RData对象不会出现在环境中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆