首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >执行后复制脚本

执行后复制脚本
EN

Stack Overflow用户
提问于 2015-07-14 21:38:45
回答 2查看 729关注 0票数 4

是否有可能将执行的行或脚本复制到工作目录中?

所以我的正常场景是,我有一个独立的脚本,它只需要在一个工作目录中获得源代码,他们会做我需要的一切。几个月后,我对这些脚本进行了更新,当我执行源代码时,我希望从脚本中获得快照……

所以基本上就是file.copy(ITSELF, '.')或者类似的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-14 22:02:43

我想这就是你要找的:

代码语言:javascript
复制
file.copy(sys.frame(1)$ofile,
          to = file.path(dirname(sys.frame(1)$ofile),
                         paste0(Sys.Date(), ".R")))

这将获取当前文件并将其复制到同一目录中名为currentDate.R的新文件中,例如2015-07-14.R

如果要复制到工作目录而不是原始脚本目录,请使用

代码语言:javascript
复制
file.copy(sys.frame(1)$ofile,
          to = file.path(getwd(),
                         paste0(Sys.Date(), ".R")))

只需注意,sys.frame(1)$ofile只有在保存的脚本是源代码的情况下才能工作,尝试在终端中运行它将失败。值得一提的是,这可能不是最佳实践。也许研究一下版本控制系统会更好。

解释:

顺便说一句,我可能不是解释这一点的最佳人选(我从某个地方复制了这个想法,有时也会用到它),但我会尝试一下。基本上,为了获得有关脚本文件的信息,R需要将其作为一个包含该信息的环境中的文件运行,并且当该环境是一个source调用时,它包含ofile数据。我们使用(1)来选择全局环境(即0)之后的下一个(source())环境。当你从终端运行这个环境时,除了全局(这就是错误信息),没有其他的框架/环境,因为没有文件正在运行--命令直接发送到终端。

为了说明这一点,我们可以做一个简单的测试:

代码语言:javascript
复制
> sys.frame(1)
Error in sys.frame(1) : not that many frames on the stack

但是如果我们从另一个函数调用它:

代码语言:javascript
复制
> myf <- function() sys.frame(1)
> myf()
<environment: 0x0000000013ad7638>

我们函数的环境中没有任何内容,因此它是存在的,但在本例中没有ofile

代码语言:javascript
复制
> myf <- function() names(sys.frame(1))
> myf()
character(0)
票数 7
EN

Stack Overflow用户

发布于 2015-07-14 22:33:59

我只想添加我的解决方案,因为我决定在执行复制命令之前使用try函数……因为我有种感觉我错过了一些控制...

代码语言:javascript
复制
try({
  script_name <- sys.frame(1)$ofile
  copy_script_name <- 
    paste0(sub('\\.R', '', basename(script_name)),
           '_',
           format(Sys.time(), '%Y%m%d%H%M%S'),
           '.R')
  file.copy(script_name,
            copy_script_name)
})

这会将脚本复制到当前目录中,并为文件名添加一个时间戳。如果出现错误,脚本的其余部分仍将执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31408320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档