为了账号安全,请及时绑定邮箱和手机立即绑定

确定执行脚本的路径

/ 猿问

确定执行脚本的路径

慕田峪9158850 2019-07-02 16:16:00

确定执行脚本的路径

我有一个叫foo.R其中包括另一个脚本other.R,它位于同一个目录中:

#!/usr/bin/env Rscriptmessage("Hello")source("other.R")

但我想R才能发现other.R不管当前的工作目录是什么。

换句话说,foo.R需要知道它自己的路。我怎么能这么做?


查看完整描述

3 回答

?
交互式爱情

这里这个问题有一个简单的解决办法。这个命令:

script.dir <- dirname(sys.frame(1)$ofile)

返回当前脚本文件的路径。脚本保存后,它就能工作了。


查看完整回答
反对 回复 2019-07-02
?
jeck猫

您可以使用commandArgs函数获取Rscript传递给实际R解释器的所有选项,并搜索它们--file=..如果您的脚本是从路径启动的,或者它是用完整路径启动的,则script.name下面将以'/'..否则,它必须相对于cwd你可以把这两条路连接起来,得到完整的路径。


编辑:听起来你只需要script.name上面要去掉路径的最后部分。我把不需要的cwd()示例并清理了主脚本,并发布了我的other.R..只需将此脚本和other.R将脚本写入同一个目录,chmod +x然后运行主脚本。


主.R:


#!/usr/bin/env Rscript

initial.options <- commandArgs(trailingOnly = FALSE)

file.arg.name <- "--file="

script.name <- sub(file.arg.name, "", initial.options[grep(file.arg.name, initial.options)])

script.basename <- dirname(script.name)

other.name <- file.path(script.basename, "other.R")

print(paste("Sourcing",other.name,"from",script.name))

source(other.name)

其他.R:


print("hello")

输出量:


burner@firefighter:~$ main.R

[1] "Sourcing /home/burner/bin/other.R from /home/burner/bin/main.R"

[1] "hello"

burner@firefighter:~$ bin/main.R

[1] "Sourcing bin/other.R from bin/main.R"

[1] "hello"

burner@firefighter:~$ cd bin

burner@firefighter:~/bin$ main.R

[1] "Sourcing ./other.R from ./main.R"

[1] "hello"

我相信这就是德曼想要的。


查看完整回答
反对 回复 2019-07-02
?
守着一只汪

当从R控制台“源”时,我无法获得SuppressingFire的解决方案。
在使用Rscript时,我无法让Hadley的解决方案工作。

两个世界中最好的?

thisFile <- function() {
        cmdArgs <- commandArgs(trailingOnly = FALSE)
        needle <- "--file="
        match <- grep(needle, cmdArgs)
        if (length(match) > 0) {
                # Rscript
                return(normalizePath(sub(needle, "", cmdArgs[match])))
        } else {
                # 'source'd via R console
                return(normalizePath(sys.frames()[[1]]$ofile))
        }}


查看完整回答
反对 回复 2019-07-02

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信