首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何相对地使用setwd?

如何相对地使用setwd?
EN

Stack Overflow用户
提问于 2019-06-17 10:06:52
回答 3查看 487关注 0票数 5

我们的团队在git repos中使用R脚本,在Mac和Windows (偶尔还有Linux)机器之间共享。这会导致脚本顶部出现一堆非常烦人的行,如下所示:

代码语言:javascript
复制
#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)

要运行脚本,我们必须注释/取消注释正确的路径变量,否则脚本将不会运行。这是烦人的、不整洁的,而且在提交历史上也会有点混乱。

过去,我通过使用shell脚本来设置相对于脚本位置的目录并跳过setwd (然后使用./run-scripts.sh而不是Rscript process.R)来解决这个问题,但是由于这里有Windows,这是行不通的。有没有更好的方法来简化这些凌乱的setwd()样板R?

(附带注意:在Python中,我通过使用路径库获取脚本文件本身的位置来解决这个问题,然后从它构建相对路径。但是R似乎没有办法获得正在运行的脚本的文件的位置?)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-17 10:23:20

答案是永远不要使用setwd()。当然,r所做的事情与Python有些不同,但这是他们的一个共同点。

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

例如,如果您有这样的布局:

代码语言:javascript
复制
.
├── data
│   └── mydata.csv
└── scripts
    └── analysis.R

您将从.运行.,而analysis.R则将data/mydata.csv引用为"data/mydata.csv“(例如,read.csv("data/mydata.csv, stringsAsFactors = FALSE))。我会保留运行R脚本的shell脚本或Makefile,并让R脚本假设它们是从git回购的顶层运行的。

这看起来可能是:

代码语言:javascript
复制
cd . # Whereever `.` above is
Rscript scripts/analysis.R

进一步读:

票数 7
EN

Stack Overflow用户

发布于 2019-06-17 10:30:22

在Python中,我通过使用路径库获取脚本文件本身的位置来解决这个问题,然后从它构建相对路径。但是R似乎没有办法获得正在运行的脚本文件的位置?

不幸的是,R本身并没有解决这个问题的方法。但是,您可以通过以下两种方法实现相同的结果:

  • 在通过source包含代码的地方使用包而不是脚本。然后,您可以使用阿米巴的答案概述的解决方案。这是因为真正的问题是R无法告诉source函数在哪里查找脚本。
  • 使用box::use而不是source。“box”包提供了允许相对导入代码模块的模块系统。它的一个很好的副作用是,包提供了一个函数,它告诉您当前脚本的路径,就像Python中的那样(而且,就像Python一样,通常不需要直接使用这个函数)。
票数 1
EN

Stack Overflow用户

发布于 2019-06-17 11:33:57

1)如果您正在寻找查找当前正在运行的脚本的路径的方法,请参见:

Rscript: Determine path of the executing script

2)另一种方法是要求用户在他们的.Rprofile文件中放置一个预先安排好的名称的选项。然后脚本可以对此进行setwd。这个系统的一个吸引人的方面是,随着时间的推移,人们可以忘记各种项目的位置,使用这个系统,您只需查看.Rprofile文件就可以提醒自己。例如,对于projectA,每个运行该项目的人都会将其放在他们的.Rprofile中

代码语言:javascript
复制
options(projectA = "...whatever...")

然后脚本将以以下内容开始:

代码语言:javascript
复制
proj <- getOption("projectA")
if (!is.null(proj)) setwd(proj) else stop("Set option 'projectA' to its directory")

如果没有定义projectA,其中一个变体是假定当前目录。虽然这看起来更灵活,但我个人认为上述代码的文档化功能是一个很大的优势。

代码语言:javascript
复制
proj <- getOption("projectA")
if (!is.null(proj)) setwd(proj) else cat("Using", getwd(), "\n")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56629068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档