是否有可能将执行的行或脚本复制到工作目录中?
所以我的正常场景是,我有一个独立的脚本,它只需要在一个工作目录中获得源代码,他们会做我需要的一切。几个月后,我对这些脚本进行了更新,当我执行源代码时,我希望从脚本中获得快照……
所以基本上就是file.copy(ITSELF, '.')
或者类似的东西。
发布于 2015-07-14 22:02:43
我想这就是你要找的:
file.copy(sys.frame(1)$ofile,
to = file.path(dirname(sys.frame(1)$ofile),
paste0(Sys.Date(), ".R")))
这将获取当前文件并将其复制到同一目录中名为currentDate.R的新文件中,例如2015-07-14.R
如果要复制到工作目录而不是原始脚本目录,请使用
file.copy(sys.frame(1)$ofile,
to = file.path(getwd(),
paste0(Sys.Date(), ".R")))
只需注意,sys.frame(1)$ofile
只有在保存的脚本是源代码的情况下才能工作,尝试在终端中运行它将失败。值得一提的是,这可能不是最佳实践。也许研究一下版本控制系统会更好。
解释:
顺便说一句,我可能不是解释这一点的最佳人选(我从某个地方复制了这个想法,有时也会用到它),但我会尝试一下。基本上,为了获得有关脚本文件的信息,R需要将其作为一个包含该信息的环境中的文件运行,并且当该环境是一个source
调用时,它包含ofile
数据。我们使用(1)
来选择全局环境(即0
)之后的下一个(source()
)环境。当你从终端运行这个环境时,除了全局(这就是错误信息),没有其他的框架/环境,因为没有文件正在运行--命令直接发送到终端。
为了说明这一点,我们可以做一个简单的测试:
> sys.frame(1)
Error in sys.frame(1) : not that many frames on the stack
但是如果我们从另一个函数调用它:
> myf <- function() sys.frame(1)
> myf()
<environment: 0x0000000013ad7638>
我们函数的环境中没有任何内容,因此它是存在的,但在本例中没有ofile
> myf <- function() names(sys.frame(1))
> myf()
character(0)
发布于 2015-07-14 22:33:59
我只想添加我的解决方案,因为我决定在执行复制命令之前使用try
函数……因为我有种感觉我错过了一些控制...
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)
})
这会将脚本复制到当前目录中,并为文件名添加一个时间戳。如果出现错误,脚本的其余部分仍将执行。
https://stackoverflow.com/questions/31408320
复制相似问题