如何以相对方式使用setwd?

fut*_*ime 4 git r

我们的团队在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似乎没有办法获取正在运行的位置脚本的文件?)

amo*_*eba 5

答案是setwd()永远不要使用。当然,R的功能与Python有所不同,但这是它们的共同点。

相反,您正在执行的所有脚本都应假定它们是从公共的顶级根文件夹运行的。当您启动一个新的R进程时,其工作目录(即getwd()给出的目录)将设置为与产生该进程的目录相同的文件夹。

例如,如果您具有以下布局:

.
??? data
?   ??? mydata.csv
??? scripts
    ??? analysis.R
Run Code Online (Sandbox Code Playgroud)

您将运行analysis.R.analysis.R将引用data/mydata.csv“数据/ mydata.csv”(例如,read.csv("data/mydata.csv, stringsAsFactors = FALSE))。我会保留运行R脚本的Shell脚本或Makefile,并让R脚本假定它们是从存储库的顶层运行的git

可能看起来像:

cd . # Whereever `.` above is
Rscript scripts/analysis.R
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

  • 软件包``here''很棒。使用目录,您将在根目录中有一个项目或“ .here”文件。然后,要获取脚本的目录,可以执行“ here('scripts','analysis.R')`”操作并完成。 (2认同)
  • 噢,我*喜欢*这里的图书馆。我将使用它。 (2认同)