可能重复:
Rscript:确定执行脚本的路径
我总是运行一个R脚本,它My Documents作为工作目录.
当我运行脚本时,我想获取脚本路径并将工作目录更改为它.我怎么能这样做?
我想让它在与该source()函数相同的文件夹中运行脚本.
我有一个脚本,当它来源时检查脚本是否以交互方式运行interactive().如果以交互方式运行,则不会搜索命令行参数.但是,如果它不是以交互方式运行,则会搜索命令行参数并引发错误.
这通常很好,但有时我写了第二个R脚本,我想独立运行只是为了处理一些数据.所以Script2源脚本1,Script1检测到它没有以交互方式运行,并开始搜索命令行参数并抛出错误.
除了interactive()脚本可以检测其上下文之外,还有其他方法吗?例如,我希望在直接运行时与在加载它以访问其内部函数之一时需要单独的行为.使用包我可以做一些类似dplyr::arrange()访问arrange而无需加载所有dplyr.
编辑:我目前非常janky解决方法是启动一个交互式会话,源脚本1,用于save.image()保存函数,然后在Script2用于load加载保存的.RData文件.但显然这不是......优雅.
我不认为我使用的确切代码是相关的,但包括它以防有人认为这对答案很重要...
剥离示例代码:
#!/usr/bin/env Rscript
library(optparse)
function1 <- function(etc,etc) {}
function2 <- function(etc,etc) {}
if(!interactive()) {
# example call
# Rscript create_reference_file.R -c cd4cd8 -o /home/outputfolder/
option_list = list(
make_option(c('-c', '--cell'), type = 'character', default = NULL,
help = 'the name of the cell',
metavar = 'character'),
make_option(c('-o','--outdir'), type = 'character', default = NULL,
help = 'the location where you wish to store …Run Code Online (Sandbox Code Playgroud) 我在自己的包中使用了 mgcv 包,到目前为止一切运行良好。但是,我尝试将 Tweedie 系列对象(“Tweedie()”、“tw()”)引入到我的包中,但是在尝试使用后者时出现错误。
函数就这么简单(这里简化了):
#' @importFrom mgcv tw
#'
.FamilyLink <- function(link) {
familyObject <- tw(link = link)
return(familyObject)
}
Run Code Online (Sandbox Code Playgroud)
我在 NAMESPACE 文件中有这个
importFrom(mgcv,tw)
Run Code Online (Sandbox Code Playgroud)
所以在安装包后我调用我的函数(非导出,它通常在我的包的其他函数中使用)
fam <- MyPackage:::.FamilyLink("log")
fam$aic(1, 1, NULL, 1, 1)
Error in ldTweedie(y, mu, p = p, phi = scale) :
could not find function "ldTweedie"
Run Code Online (Sandbox Code Playgroud)
然后我尝试添加:
importFrom(mgcv,ldTweedie)
importFrom(mgcv,tw)
Run Code Online (Sandbox Code Playgroud)
安装了软件包并遇到了同样的问题。但是,如果我使用 devtools 加载我的包:
devtools::load_all("MyPackage")
fam <- .FamilyLink("log")
fam$aic(1, 1, NULL, 1, 1)
[1] 4.05723
Run Code Online (Sandbox Code Playgroud)
一切正常。所以我想知道我在这里做错了什么,或者我怎样才能通过安装而不使用 load_all() 来让我的包/函数工作?谢谢
是否有可能将执行的行或基本上的脚本复制到工作目录中?
所以我的正常情况是,我有一个独立的脚本,只需要在工作目录中获取,他们将完成我需要的一切.几个月后,我对这些脚本进行了更新,我希望在执行源代码时从脚本中获取快照...
所以基本上file.copy(ITSELF, '.')或类似的东西.
我们的团队在git repos中使用R脚本,这些脚本在Mac和Windows(有时是Linux)计算机上由多个人共享。这往往会导致在脚本顶部出现一堆非常令人讨厌的行,如下所示:
#path <- 'C:/data-work/project-a/data'
#path <- 'D:/my-stuff/project-a/data'
path = "~/projects/project-a/data"
#path = 'N:/work-projects/project-a/data'
#path <- "/work/project-a/data"
setwd(path)
Run Code Online (Sandbox Code Playgroud)
要运行脚本,我们必须注释/取消注释正确的路径变量,否则脚本将无法运行。这很烦人,不整洁,并且在提交历史记录中也常常有些混乱。
过去,通过使用Shell脚本设置相对于脚本位置的目录并完全跳过setwd(然后使用./run-scripts.sh代替Rscript process.R)来解决这个问题,但是由于这里有Windows用户,因此无法使用。有没有更好的方法来简化setwd()R中这些混乱的样板?
(旁注:在Python中,我通过使用路径库来获取脚本文件本身的位置,然后从中建立相对路径来解决此问题。但是R似乎没有办法获取正在运行的位置脚本的文件?)