如何保存使用assign()创建的R数据对象?

如何保存使用assign()创建的R数据对象?,r,save,variable-assignment,R,Save,Variable Assignment,我正在基于某些字符串组合创建变量。 每个变量将存储一些值。在本例中,为了简单起见,它们存储一个数值值。 然而,在实际问题中,每个都将存储一个tible 我需要将每个tibble存储为RData,并且必须使用字符串的唯一组合来创建它们 问题是当我对这个变量使用save()时,它找不到它,所以保存会失败 res <- 12345 sku = 'sku_a' index = '1' # create variable based on string combination # assign v

我正在基于某些
字符串
组合创建变量。
每个变量将存储一些值。在本例中,为了简单起见,它们存储一个
数值
值。 然而,在实际问题中,每个都将存储一个
tible

我需要将每个
tibble
存储为
RData
,并且必须使用字符串的唯一组合来创建它们

问题是当我对这个变量使用
save()
时,它找不到它,所以保存会失败


res <- 12345
sku = 'sku_a'
index = '1'
# create variable based on string combination
# assign variable value with res
assign(paste0(index,'_arima_',sku), res) 

# return the value of the created variable
get(paste0(index,'_arima_',sku))

# save created variable as RData
save(paste0(index,'_arima_',sku), file = paste0(index,'_arima_',sku,'.RData'))
Error in save(paste0(index, "_arima_", sku), file = paste0(index, "_arima_",  : 
  object ‘paste0(index, "_arima_", sku)’ not found

save(get(paste0(index,'_arima_',sku)), file = paste0(index,'_arima_',sku,'.RData'))
Error in save(get(paste0(index, "_arima_", sku)), file = paste0(index,  : 
  object ‘get(paste0(index, "_arima_", sku))’ not found

save(eval(paste0(index,'_arima_',sku)), file = paste0(index,'_arima_',sku,'.RData'))
Error in save(eval(paste0(index, "_arima_", sku)), file = paste0(index,  : 
  object ‘eval(paste0(index, "_arima_", sku))’ not found



ressave
的第一个参数是
..
操作符,它被捕获为未赋值,因此您似乎不能在这里放置表达式。如果加载了magrittr或dplyr,一种快速解决方法是使用管道,这将起作用:


请注意,增加的复杂性是变量名称不应以R中的数字开头。在您的情况下,只能通过
'1_arima_sku_a'
从控制台获取变量(即需要引用)

未计算
save
操作符的
的第一个参数,看来你不能在这里表达。如果加载了magrittr或dplyr,一种快速解决方法是使用管道,这将起作用:


请注意,增加的复杂性是变量名称不应以R开头。在您的情况下,只能通过
'1\u arima\u sku\u a'
从控制台获取变量(即需要引用)

保存
命令中需要
获取
。更好的是,忘记
assign
(现在)并学习使用列表而不是
assign
/
get
编码噩梦。实际上,由于一些服务器问题,我别无选择,只能在这里使用assign。基本上,服务器会随机崩溃,我会丢失以前的所有结果,除非我存储每次迭代的每个结果。然后从它崩溃的最后一点继续返回。我在上面的第二个选项中使用了get(),不确定是否可以看到它。save命令中的save(get(object))@Roland a
get
在这里没有帮助。
save
的第一个参数似乎没有经过任何计算就被捕获了。您的第二点当然是正确的。您可以将迭代的结果存储在列表中,就像您可以将它们存储在全局环境中一样。实际上没有理由在R中使用
assign
,除非您需要对指定给的环境对象进行精细控制。您没有这种情况。@罗兰在实际代码中,结果存储在列表中。但是列表的问题是,如果服务器由于任何原因崩溃,列表对象将丢失。因此,我必须再次运行整个循环。如果我可以在每次迭代时保存更新的列表对象,而不是将每次迭代的结果保存在单独的对象中,可能会更好。您需要在
save
命令中使用
get
。更好的是,忘记
assign
(现在)并学习使用列表而不是
assign
/
get
编码噩梦。实际上,由于一些服务器问题,我别无选择,只能在这里使用assign。基本上,服务器会随机崩溃,我会丢失以前的所有结果,除非我存储每次迭代的每个结果。然后从它崩溃的最后一点继续返回。我在上面的第二个选项中使用了get(),不确定是否可以看到它。save命令中的save(get(object))@Roland a
get
在这里没有帮助。
save
的第一个参数似乎没有经过任何计算就被捕获了。您的第二点当然是正确的。您可以将迭代的结果存储在列表中,就像您可以将它们存储在全局环境中一样。实际上没有理由在R中使用
assign
,除非您需要对指定给的环境对象进行精细控制。您没有这种情况。@罗兰在实际代码中,结果存储在列表中。但是列表的问题是,如果服务器由于任何原因崩溃,列表对象将丢失。因此,我必须再次运行整个循环。如果我可以在每次迭代时保存更新的列表对象,而不是将每次迭代的结果保存在单独的对象中,可能会更好。谢谢@Allan,谢谢你提醒我从数字开始。使用管道解决了保存问题。但由于某些原因,即使数据被有效保存,数据似乎也无法加载回R环境。我想这是一个单独的问题,所以我在这里创建了一个新的问题。谢谢@Allan,谢谢你提醒我从数字开始。使用管道解决了保存问题。但由于某些原因,即使数据被有效保存,数据似乎也无法加载回R环境。我认为这是一个单独的问题,所以我在这里创建了一个新的问题
paste0(index,'_arima_',sku) %>% save(file = paste0(index,'_arima_',sku,'.RData'))