如何在R函数中以编程方式创建和分配变量

如何在R函数中以编程方式创建和分配变量,r,R,我试图从Quandl下载数据集,将我自己新创建的名称分配给我在函数中创建的数据帧,然后将它们保存为R.data文件,以便在以后的会话中加载回全局环境 我遇到的问题是保存R.data文件的方式,当我重新加载文件时,它具有我想要的数据帧变量名 例如,我尝试了以下函数: retrieve_FRED_data <- function(dataID = Quandl_FRED_Identifier, filename = assigned_name) { require(Quandl)

我试图从Quandl下载数据集,将我自己新创建的名称分配给我在函数中创建的数据帧,然后将它们保存为R.data文件,以便在以后的会话中加载回全局环境

我遇到的问题是保存R.data文件的方式,当我重新加载文件时,它具有我想要的数据帧变量名

例如,我尝试了以下函数:

retrieve_FRED_data <-
  function(dataID = Quandl_FRED_Identifier, filename = assigned_name) {
    require(Quandl)
    Quandl.api_key("xxxxxxxxxxxx")
    data <- Quandl(paste(c("FRED/", dataID), collapse = ""))
    assign(filename, data)
    save(filename, file = paste(c(filename, ".Rdata"), collapse = ""))
    return(filename)
  }

retrieve\u FRED\u data在下面的内容中,我注释掉了
Quandl
相关内容,只是为了测试代码的
save
部分。因此传递给函数的参数之一是伪参数。对于您的实际用例,删除注释字符,它将满足您的需要。在工作目录中创建一个文件,测试数据集
data
保存在参数
Quandl\u FRED\u identifier=“x”
下,并由函数返回

retrieve_FRED_data <-
  function(dataID = Quandl_FRED_Identifier, filename = assigned_name) {
#    require(Quandl)
#    Quandl.api_key("xxxxxxxxxxxx")
#    data <- Quandl(paste(c("FRED/", dataID), collapse = ""))
    assign(dataID, data)
    save(list = dataID, file = paste0(filename, ".Rdata"))
    return(get(dataID))
  }

data <- data.frame(X = 1:5, Y = 6:10)
Quandl_FRED_Identifier <- "x"  # name of the object (df) to be saved
assigned_name <- "so"    # so = stackoverflow, obviously
retrieve_FRED_data(Quandl_FRED_Identifier, assigned_name)
#  X  Y
#1 1  6
#2 2  7
#3 3  8
#4 4  9
#5 5 10
编辑2.
函数正在创建具有根据传递给它的参数命名的对象的文件。考虑到注释中的混乱,我将重复上面代码的一部分,即对函数的第一次调用。它将创建一个名为
x
的df文件
so.RData
。第二个调用使用df
y
创建一个文件
so2.RData
。然后,我删除
x
y
。当文件被加载时,df将按预期在globalenv中

data <- data.frame(X = 1:5, Y = 6:10)
Quandl_FRED_Identifier <- "x"  # 
assigned_name <- "so"    # so = stackoverflow, obviously
retrieve_FRED_data(Quandl_FRED_Identifier, assigned_name)

set.seed(1)
data <- data.frame(A = rnorm(5), B = rnorm(5))
Quandl_FRED_Identifier <- "y"  # 
assigned_name <- "so2"    # so = stackoverflow, obviously
retrieve_FRED_data(Quandl_FRED_Identifier, assigned_name)

rm(x, y)

load("so.RData")
load("so2.RData")

x
y

data在下面的内容中,我注释掉了
Quandl
相关内容,只是为了测试代码的
save
部分。因此传递给函数的参数之一是伪参数。对于您的实际用例,删除注释字符,它将满足您的需要。在工作目录中创建一个文件,测试数据集
data
保存在参数
Quandl\u FRED\u identifier=“x”
下,并由函数返回

retrieve_FRED_data <-
  function(dataID = Quandl_FRED_Identifier, filename = assigned_name) {
#    require(Quandl)
#    Quandl.api_key("xxxxxxxxxxxx")
#    data <- Quandl(paste(c("FRED/", dataID), collapse = ""))
    assign(dataID, data)
    save(list = dataID, file = paste0(filename, ".Rdata"))
    return(get(dataID))
  }

data <- data.frame(X = 1:5, Y = 6:10)
Quandl_FRED_Identifier <- "x"  # name of the object (df) to be saved
assigned_name <- "so"    # so = stackoverflow, obviously
retrieve_FRED_data(Quandl_FRED_Identifier, assigned_name)
#  X  Y
#1 1  6
#2 2  7
#3 3  8
#4 4  9
#5 5 10
编辑2.
函数正在创建具有根据传递给它的参数命名的对象的文件。考虑到注释中的混乱,我将重复上面代码的一部分,即对函数的第一次调用。它将创建一个名为
x
的df文件
so.RData
。第二个调用使用df
y
创建一个文件
so2.RData
。然后,我删除
x
y
。当文件被加载时,df将按预期在globalenv中

data <- data.frame(X = 1:5, Y = 6:10)
Quandl_FRED_Identifier <- "x"  # 
assigned_name <- "so"    # so = stackoverflow, obviously
retrieve_FRED_data(Quandl_FRED_Identifier, assigned_name)

set.seed(1)
data <- data.frame(A = rnorm(5), B = rnorm(5))
Quandl_FRED_Identifier <- "y"  # 
assigned_name <- "so2"    # so = stackoverflow, obviously
retrieve_FRED_data(Quandl_FRED_Identifier, assigned_name)

rm(x, y)

load("so.RData")
load("so2.RData")

x
y

data如果我要这样做,我会将它分为三个函数。第一次读取您的数据,不管您怎么做。第二个变量使用新变量名在Rdata文件中保存一个R变量,默认文件名为该变量名。第三种方法将它们放在一起,读取数据并使用新名称保存数据,使用默认的文件名作为名称

readQuandl <- function(dataID, dir="FRED") {
    Quandl.api_key("xxxxxxxxxxxx")
    Quandl(file.path(dir, dataID))
}

saveAs <- function(x, name, file=paste0(name,".RData")) {
    assign(name, x)
    save(list=name, file=file)
}

saveQuandlAs <- function(dataID, name) {
    x <- readQuandl(dataID)
    saveAs(x, name)
}

readQuandl如果我要这样做,我会将它分为三个函数。第一次读取您的数据,不管您怎么做。第二个变量使用新变量名在Rdata文件中保存一个R变量,默认文件名为该变量名。第三种方法将它们放在一起,读取数据并使用新名称保存数据,使用默认的文件名作为名称

readQuandl <- function(dataID, dir="FRED") {
    Quandl.api_key("xxxxxxxxxxxx")
    Quandl(file.path(dir, dataID))
}

saveAs <- function(x, name, file=paste0(name,".RData")) {
    assign(name, x)
    save(list=name, file=file)
}

saveQuandlAs <- function(dataID, name) {
    x <- readQuandl(dataID)
    saveAs(x, name)
}

readQuandl是的,我也能做到这一点,但这并不能解决我的问题。当数据帧重新加载回工作区时,问题将成为分配给该数据帧的名称。在这种情况下,它将始终命名为“数据”。它不采用变量名“so”。这对我不起作用,因为我需要下载几个不同的数据集,并为它们指定不同的名称,然后将整个组重新加载到我的工作区中,每个数据集都有不同的指定名称。@那么什么不起作用呢?文件与数据框一起保存,不是吗?是的,它保存了文件,文件名正确,但数据框变量名不是重新加载时指定的名称。我可以使用正确的文件名重新加载它,但分配给数据帧的变量名是“data”,而不是“so”。因此,当我尝试重新加载多个数据文件时,每个文件都有一个唯一的文件名,它们最终都会覆盖名为“data”的同一个数据帧变量,我只会得到一个名为“data”的数据帧,这将是最后一个要加载的对象。
assign
的原因是我试图复制原始的
数据
对象,并给它正确的
assigned\u名称
。这是可行的,我得到了dataframe对象所需的变量名,但我想不出用这个名称保存它的方法。是的,我也能做到这一点,但这并不能解决我的问题。当数据帧重新加载回工作区时,问题将成为分配给该数据帧的名称。在这种情况下,它将始终命名为“数据”。它不采用变量名“so”。这对我不起作用,因为我需要下载几个不同的数据集,并为它们指定不同的名称,然后将整个组重新加载到我的工作区中,每个数据集都有不同的指定名称。@那么什么不起作用呢?文件与数据框一起保存,不是吗?是的,它保存了文件,文件名正确,但数据框变量名不是重新加载时指定的名称。我可以使用正确的文件名重新加载它,但分配给数据帧的变量名是“data”,而不是“so”。因此,当我尝试重新加载多个数据文件时,每个文件都有一个唯一的文件名,它们最终都会覆盖名为“data”的同一个数据帧变量,我只会得到一个名为“data”的数据帧,这将是最后一个要加载的对象。
assign
的原因是我试图复制原始的
数据
对象,并给它正确的
assigned\u名称
。这起作用了,我得到了dataframe对象所需的变量名,但我不能