【问题标题】:Importing a file only if it has been modified since last import and then save to a new object仅当自上次导入后已修改文件时才导入文件,然后保存到新对象
【发布时间】:2016-11-26 23:38:13
【问题描述】:

我正在尝试创建一个每周运行一次的脚本。目标是它会检查同事管理的 MS Excel 文件。然后它会测试文件的修改日期是否比上次导入的日期新。如果它是较新的,它会将文件(我正在使用 readxl 包 - WONDERFUL!)导入一个新对象,该对象的名称以原始 Excel 文件最后一次修改的日期命名,包含在对象名称中。除了将导入的 data.frame 分配给包含日期的新对象之外,我一切正常。

我正在使用的代码示例是:

首先我创建一个对象,其路径指向感兴趣的文件。

pfdFilePath <- file.path("H:", "3700", "3780", "002-00", "3. 
    Project Information", "Program", "RAH program.xls")

经过测试验证文件已被修改,我尝试了简单的赋值(“test”只是一个简化的例子):

paste("df-", as.Date(file.info(pfdFilePath)$mtime), sep = "") <- "test"

但该代码会产生错误:

粘贴错误("df-", as.Date(file.info(pfdFilePath)$mtime), sep = "")

然后我尝试分配功能:

assign(paste("df-", as.Date(file.info(pfdFilePath)$mtime), sep = ""), "test")

运行此代码会创建一个看起来没问题的对象,但是当我对其进行评估或尝试使用 str() 或 class() 时,我收到以下错误:

df 中的错误 - df-2016-08-09 : 二元运算符的非数字参数

我很确定这是一个与我使用 assign 的环境有关的错误,但对于 R 来说相对较新,我无法弄清楚。我知道 assign 函数似乎不受欢迎,但这些警告似乎集中在 for-loops 与 lapply 函数上。不过,我并没有真正在函数中进行迭代。每当我运行脚本时,它只是一个动态命名的对象。我想不出更好的方法来做到这一点。如果有另一种不需要分配功能的方法,或者更好的使用分配功能的方法,我很想知道。

提前谢谢你,如果这是重复的,对不起。我花了整个晚上的时间在挖掘,却无法得到我需要的东西。

【问题讨论】:

  • 试试assign(paste("df", strftime(file.info(some_shell_file)$mtime,"%Y%m%d"), sep = "_"), "test")。这并不是真正的环境错误。你的变量名是一个错误。它包含彼此相减的字符串和数字:"df" - 2016 - 08 - 09。这基本上就是问题所在。
  • 我只是略过这个,但 Makefile 能否成为您想要完成的解决方案?
  • 感谢达森的建议。我不熟悉 Makefile 解决方案。我检查了它,但可能比我需要的更多。
  • Abdou,R 有点像高尔夫,它能让人保持谦虚。我会尝试你的建议并发布我的结果。谢谢。

标签: r assign


【解决方案1】:

阿卜杜提供了钥匙。

assign(paste0("df.", "pfd.", strftime(file.info(pfdFilePath)$mtime, "%Y%m%d")), "test01")

我还转换为更简洁的 paste0 函数,并去掉了破折号以避免混淆。经验教训。

完美运行。

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 2018-08-11
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2020-06-17
    • 2021-03-15
    相关资源
    最近更新 更多