0

有几篇与这个主题相关的帖子,但这些解决方案(类似的东西source(.., chdir=TRUE))似乎都不适合我。我需要一个 r 脚本,它可以识别其目录并将 R 工作目录设置为此使用setwd(). 换句话说,脚本需要将 R 工作目录设置为存储脚本的目录。在附近的目录中也有多个脚本副本。IE

"../CCurtisModelData/run1/myscript.r"

"../CCurtisModelData/run2/myscript.r"

"../CCurtisModelData/run3/myscript.r"

因此,如果 myscript 从 run3 执行,则需要确定它在 run3 中。这段代码需要放在脚本的开头,这样我就可以设置工作目录并使用相对路径加载数据。

我不能使用 R 包。

我无法重命名 myscipt 即 myscript1.r。

我的脚本是从包含在"../CCurtisModelData/run1" "../CCurtisModelData/run2" "../CCurtisModelData/run3".

批处理文件看起来像这样。脚本的路径是相对的。

"C:\Users\ccurtis11\Documents\R\R-3.0.1\bin\x64\R.exe" CMD BATCH "myscript.r" "myscript.r.rout"

我知道我应该使用Rscript,但我首先使用了我的脚本CMD,我喜欢我可以让它报告一个 .rout 文件。将来我可能会切换到Rscript。如果切换不能帮助我解决我的具体问题,那么我现在对切换不感兴趣。

我想到的唯一其他可能的选择可能是让批处理文件将目录信息传递给 r 脚本。在与同事协商后,我相当肯定这会奏效。我正在做一些并行处理工作,并让 r 为计算机模型处理一些数据处理。所以我仍然在学习我能摆脱什么。

因此,如果有人可以指导我如何将目录信息从批处理文件传递到 R,那就太好了。

但是,如果有一个解决方案让 r 脚本完成所有工作,那将会更有说服力。

我能得到的最接近的是这个。

filenam=list.files("..",full.names=TRUE,recursive=TRUE,pattern="(myscript.r)") setwd(dirname(filenam))

问题在于它找到 myscript.r 的所有副本并返回第一个,即“../run1/myscript.r”

感谢您的专业人士提出的任何想法。

4

2 回答 2

2

我刚刚为一些我试图使其普遍可移植的脚本解决了这个问题。为确保脚本的可移植性,请始终从以下内容开始:

wd <- getwd()
setwd(wd)

以字符串的形式将当前目录分配给字符对象允许您将该字符对象插入到 setwd() 中,并且 Presto 您的代码将始终以其当前目录作为工作目录运行,无论它是哪台机器它位于文件结构中的位置或位置。(额外的好处:wd 对象可以与 file.path() 一起使用(即 file.path(wd, "output_directory") 以允许创建标准输出目录,而不管通向您的命名目录的文件路径如何。这确实需要您在以这种方式引用它之前创建新目录,但这也可以通过 wd 对象来帮助。

(我知道我为另一个几乎相同的问题发布了这个答案。我并不是想为这个答案加分,我只是想解决这些现有问题,以解决我遇到的一个相关问题 auto-定位 RScript 可执行文件(远程系统)并自动设置其文件路径。)

于 2016-08-06T01:12:34.877 回答
1

好的,我为自己的问题发布答案而感到难过,但我认为它是否可以帮助某人解决问题,这是值得的。

事实证明,我正在使用的事实R CMD真的让我退缩了。

一旦我切换到Rscript我重试工作的第一个解决方案。好消息是我仍然可以拥有我的 r.out 文件。

我的.bat

"C:\Users\ccurtis11\Documents\R\R-3.0.1\bin\x64\Rscript.exe" myscript.r > myscript.r.rout

无名氏:

args <- commandArgs(trailingOnly = F)

scriptPath <- normalizePath(dirname(sub("^--file=", "", args[grep("^--file=", args)])))

setwd(scriptPath)

getwd()

我添加了getwd()这样我可以通过查看 myscript.r.rout 文件来检查它是否正常工作,但getwd不需要。

于 2013-09-19T04:33:13.367 回答