R 尝试以交互方式加载由暂停的批处理脚本保存的数据文件时出错

R 尝试以交互方式加载由暂停的批处理脚本保存的数据文件时出错,r,session,persistence,environment,rdata,R,Session,Persistence,Environment,Rdata,在调试和解决检索属性()问题的过程中,根据这里的建议,我相应地从使用save()和load()切换到saveRDS()和readRDS() 我的调查(通过非交互式调试打印)显示如下: 在初始saveRDS()之后,保存的对象立即包含有问题的属性 在脚本首次运行后执行的交互式R会话显示保存对象中属性的缺失 上面的发现解释了在脚本的下一次运行期间未能检索到所述属性的原因,我最初错误地将其归因于save/load和saveRDS/readRDS行为 为了在初始saveRDS之后立即手动确认持久对象中是

在调试和解决检索属性()问题的过程中,根据这里的建议,我相应地从使用
save()
load()
切换到
saveRDS()
readRDS()

我的调查(通过非交互式调试打印)显示如下:

  • 在初始
    saveRDS()之后,保存的对象立即包含有问题的属性

  • 在脚本首次运行后执行的交互式R会话显示保存对象中属性的缺失

  • 上面的发现解释了在脚本的下一次运行期间未能检索到所述属性的原因,我最初错误地将其归因于
    save/load
    saveRDS/readRDS
    行为

  • 为了在初始
    saveRDS
    之后立即手动确认持久对象中是否存在属性(保存在
    .rds
    文件中),我决定使用
    扫描
    暂停在一个终端窗口中运行的批处理R脚本(
    readLine
    在批处理R脚本中似乎对此不起作用):

    以下输出描述了调查时我的R环境

    > sessionInfo()
    R version 3.0.2 (2013-09-25)
    Platform: x86_64-pc-linux-gnu (64-bit)
    
    locale:
     [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
     [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
     [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
     [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
     [9] LC_ADDRESS=C               LC_TELEPHONE=C
    [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base
    
    对我来说,唯一合理的解释是批处理会话(特别是通过
    扫描进行暂停)
    以某种方式锁定或修改环境,使其无法从交互式会话中正确访问R对象。可能存在其他可能的原因。我非常感谢任何帮助或建议来解决此问题!

    更新:

    在终止批处理R脚本的进程后(在
    扫描之后变得无响应),我再次尝试手动加载
    .rds
    文件,希望由于批处理脚本中没有暂停而成功。然而,令我惊讶的是,我收到了完全相同的错误消息。这使我认为
    .rds
    文件确实已损坏(可能是由于我反复按Ctrl-C键停止正在运行的batch R脚本的做法,我需要想出更“温和”的方法。)在找到停止正在运行的脚本的更好方法后,我将尝试重现该场景并在此处报告

    更新2:

    从缓存目录中删除所有(可能损坏的)
    .rds
    文件后,按照上述方案(以交互方式加载R数据文件,并暂停批处理R脚本),输出显示了与以前完全相同的错误消息。此时,我真的需要一个建议来弄清楚发生了什么

    UPADATE 3(保存对象):

    assign(dataName,srdaGetData())
    
    数据如果使用
    saveRDS
    保存某些内容,则等效的
    加载
    功能是
    readRDS
    / 如果
    将对象保存到
    RData
    文件中,则应使用
    load
    加载对象

    readRDS
    将允许您指定正在加载的对象的名称

    load
    .RData
    文件中加载
    对象
    ,它们将保留保存它们时使用的名称

    如果使用
    saveRDS
    保存了
    。/cache/SourceForge/ZGV2TGlua3M=.rds“
    ,则

    whatever <- readRDS("../cache/SourceForge/ZGV2TGlua3M=.rds")
    

    非常感谢!我在脚本中使用了正确的函数对,但在交互式会话中完全忘记了这一点。我只是尝试了一下,
    readRDS(…)
    确实有效,但是
    readRDS(load(…)
    没有(导致相同的错误消息)。但是,
    readRDS()的返回值
    包含我要保存的对象的名称,但不是预期的对象本身…相应地,假定已保存的属性丢失。是的,这是有效的!谢谢!您对readRDS()的原因有何评论返回对象的名称,而不是对象本身。请查看我的更新3以及保存对象的代码。@AleksandrBlekh-发布一个可复制的示例添加了可复制的示例(更新4)。这是一个单独的问题,带有改进的可复制示例:。您的示例(和更新)保持完全不可复制!@mnel:对不起,我以为只要看一下这段相当简单的代码就可以看出问题所在。我将尝试提出一个可复制的示例。
    > sessionInfo()
    R version 3.0.2 (2013-09-25)
    Platform: x86_64-pc-linux-gnu (64-bit)
    
    locale:
     [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
     [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
     [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
     [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
     [9] LC_ADDRESS=C               LC_TELEPHONE=C
    [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base
    
    assign(dataName, srdaGetData())
    data <- as.name(dataName)
    
    # save hash of the request's SQL query as data object's attribute,
    # so that we can detect when configuration contains modified query
    attr(data, "SQL") <- base64(request)
    
    # save current data frame to RDS file
    saveRDS(data, rdataFile)
    
    library(RCurl)
    
    info <- "Important data"
    request <- "SELECT info FROM topSecret"
    dataName <- "sf.data.devLinks"
    rdataFile <- "/tmp/testAttr.rds"
    
    getData <- function() {
      return (info)
    }
    
    requestDigest <- base64(request)
    
    # check if the archive file has already been processed
    message("\nProcessing request \"", request, "\" ...\n")
    
    # read back the object with the attribute
    if (file.exists(rdataFile)) {
      # now check if request's SQL query hasn't been modified
      data <- readRDS(rdataFile)
      message("Retrieved object '", as.name(data), "', containing:\n")
      message(toString(data))
    
      requestAttrib <- attr(data, "SQL", exact = TRUE)
      message("\nObject '", data, "' contains attribute:\n\"",
                     base64(requestAttrib), "\"\n")
    
      if (identical(requestDigest, requestAttrib)) {
        message("Processing skipped: RDS file is up-to-date.\n")
        stop()
      }
      rm(data)
    }
    
    message("Saving results of request \"",
            request, "\" as R data object ...\n")
    
    assign(dataName, getData())
    data <- as.name(dataName)
    
    # save hash of the request's SQL query as data object's attribute,
    # so that we can detect when configuration contains modified query
    attr(data, "SQL") <- base64(request)
    
    # save current data frame to RDS file
    saveRDS(data, rdataFile)
    
    whatever <- readRDS("../cache/SourceForge/ZGV2TGlua3M=.rds")