RDA文件在环境中更改为不同的名称

时间:2016-08-11 21:03:16

标签: r

当我将RDA文件加载到全局环境中时,为什么结果数据框会更改为其他名称?如何在RDA创建的函数内重命名?

我的函数被称为SaveRDAtoDisk(table)并且接受一个表名,该函数读取SQL数据并将数据帧保存为RDA。问题是我知道输入的表名有下划线,所以我将所需的输出表名分配给变量:

name.of.table.dt <- paste0(gsub("_", ".", table), ".dt", sep = "")

所以这应该输出所需的数据框名称。

函数SaveRDAtoDisk("big_table")正确输出一个名为big.table.dt.rda的RDA,但是当我加载RDA时,它应该加载名称big.table.dt,但它会被加载为name.of.table.dt这是我在函数中赋值的变量。怎么回事呢?

# This function takes in a table name that contains underscores
# So I call SaveRDAtoDisk("log_hunter") and it loads a log.hunter.dt.rda into the current directory

# The problem is when I load the log.hunter.dt.rda file into the environment, the data frame is called name.of.table.dt (should be log.hunter.dt)

SaveRDAtoDisk <- function(table) {

  # This line changes "log_hunter" into "log.hunter.dt.rda"
  name.of.table.dt.rda <- paste0(gsub("_", ".", table), ".dt.rda", sep = "")

  # This line changes "log_hunter" into "log.hunter.dt"
  name.of.table.dt <- paste0(gsub("_", ".", table), ".dt", sep = "")

  # This is the select statement that saves the sql query into the RDA file
  name.of.table.dt.sql = paste0("select * from ", table, sep = "")

....
  # Executes select query above
  dt1 <- dbSendQuery(con, name.of.table.dt.sql)

  # Should be "log.hunter.dt" <- fetch(dt1, rows.testing)
  name.of.table.dt <- fetch(dt1, rows.testing)

  # This properly saves the file "log.hunter.dt.rda"
  save(name.of.table.dt, file = name.of.table.dt.rda)
  dbClearResult(dt1)
}

因此,当我将RDA加载到环境中时,它会加载一个名为&#34; name.of.table.dt&#34;的数据框。即使RDA被正确命名并且在函数中分配了变量,也不是big.table.dt

1 个答案:

答案 0 :(得分:2)

name.of.table.dt不一定要重命名变量。您要求它保存table <- "hello" #testing name.of.table.dt <- paste0(gsub("_", ".", table), ".dt", sep = "") name.of.table.dt.rda <- paste0(gsub("_", ".", table), ".dt.rda", sep = "") # store actual data in temp variable # xx <- fetch(dt1, rows.testing) xx <- 15 # testing save(list=name.of.table.dt, file=name.of.table.dt.rda, envir=as.environment(setNames(list(xx), name.of.table.dt))) 变量,以便它正是它正在做的事情。如果要将其另存为其他变量,则需要使用该名称创建变量。这是一种方式。您可以使用具有正确名称的对象创建临时环境,然后在该环境中使用save。

exists("hello.dt")
# [1] FALSE
load(name.of.table.dt.rda)
exists("hello.dt")
# [1] TRUE

然后我们可以看到我们可以加载&#34; hello.dt&#34;

def static_vars(**kwargs):
    def decorate(func):
        for k in kwargs:
            setattr(func, k, kwargs[k])
        return func
    return decorate

@static_vars(counter=0)
def TransferStats(transferedBytes, totalBytes):
    if (transferedBytes / totalBytes) >= TransferStats.counter:
        log.info('Transferred: {}% [{}/{}]'.format(round((transferedBytes/totalBytes)*100,2), transferedBytes, totalBytes))
        TransferStats.counter += 0.025