如果附近有多个副本,如何告诉rscript报告其路径/目录

时间:2013-09-18 07:26:50

标签: r batch-file directory

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

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

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

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

因此,如果从run3执行myscript,则需要在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脚本完成所有工作,那将更加雄辩。

我能得到的最接近的是。

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

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

感谢您提出的专业建议。

2 个答案:

答案 0 :(得分:2)

我刚刚解决了一些脚本,我试图使其具有普遍的便携性。要确保脚本的可移植性始终以:

开头
wd <- getwd()
setwd(wd)

将当前目录以字符串的形式分配给字符对象,然后允许您将该字符对象插入到setwd()和Presto中,您的代码将始终以其当前目录作为工作目录运行,无论其中它所在的机器或文件结构所在的位置。 (额外奖励:wd对象可以与file.path()一起使用(即.file.path(wd,&#34; output_directory&#34;),以允许创建标准输出目录,而不管文件路径如何到你的命名目录。这确实要求你在以这种方式引用之前创建新目录,但这也可以用wd对象帮助。

(我知道我已经将这个答案发布在另一个几乎完全相同的问题上了。我并没有试图将这个答案用于分数,我只是试图解决这些现有问题。相关问题我自动定位RScript可执行文件(远程系统)并自动设置其文件路径。)

答案 1 :(得分:1)

好的,我觉得发布自己问题的答案感觉很糟糕,但我认为这可能会让某些人感到有帮助。

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

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

my.bat

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

myrscript:

args <- commandArgs(trailingOnly = F)

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

setwd(scriptPath)

getwd()

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