在脚本中使用setwd()的风险?

Ric*_*rta 25 r setwd

我听说它说setwd()在脚本中使用是不好的做法.

  • 与之相关的风险/危险是什么?
  • 什么是更好的选择?

Ben*_*ker 29

这是一个可重现代码的问题.如果您指定其他人的计算机上不存在的目录,则他们无法使用您的代码.对于绝对文件路径,这尤其糟糕,特别是对于Windows文件路径(在Unix系统上绝对无法复制).

我首选的解决方案是在开始运行代码之前指定用户应该位于自己系统上的相关目录中.如果为了您自己的方便,您希望setwd(...)在代码的顶部放置一个权限,其他人可以注意到它并在适当的时候将其注释掉,但是其余的代码只假定来自该起始目录的相对路径,这对我来说没问题.

谢毅辉(作者knitr)对此感到特别强烈:

https://groups.google.com/forum/?fromgroups=#!topic/knitr/knM0VWoexT0

无论何时您想要操作文件,都假定它们位于源的同一目录下(例如Rnw文档).然后你总是可以使用相对路径,你永远不需要setwd().使用setwd()与可重复性原则相矛盾,例如,您使用setwd('foo/bar /'),并且该目录可能不存在于其他人的计算机中.请参阅常见问题7:https: //github.com/yihui/knitr/blob/master/FAQ.md

从前面提到的FAQ 7:

你最好不要这样做[更改knitr代码块内的工作目录].您的工作目录始终是getwd()(所有输出文件都将在此处写入),但代码块将在输入文档所在的目录下进行评估.在运行R代码时更改工作目录通常是一种不好的做法.有关讨论,请参见#38.您应该尽可能避免使用绝对目录(使用相对目录),因为它使事情的可重现性降低.

另见:https://github.com/yihui/knitr/issues/38

  • 使这种风格工作的一个原因是`source(chdir = T)`. (2认同)

Sea*_*ean 6

我无法想到setwd()在我管理的服务器上运行的脚本中使用任何特定问题,因为它确实会返回一个可以用try()捕获的错误,并且您可以管理它.setwd()当我对路径懒惰时我已经习惯了 - 见下文!

file.path()在脚本制作或其他方面广泛使用.处理输入目录中的文件并将输出图形和报告放在其他位置.所以有些东西......(未经测试)这将是一个有点乏味的使用setwd().

kInDir <- '~/Indir'
kOutDir <- '~/Outdir'
flist <- dir(path=kInDir, pattern='^[a-z]{2,5}\\.csv$')
# note I could have used full.names=T - but it's easier not to...
for (fnam in flist) {
  # full path to the report file created
  sfnam <- file.path(kOutDir, gsub('.csv', '_report.txt', fnam))
  # full path to the csv file that will be created
  ofnam <- file.path(kOutDir, gsub('.csv', '_b.csv', fnam))
  #
  # ok... we're going to process this CSV file...
  r1 <- read.csv(file.path(kInDir, fnam))
  #
  # we''ll put the output from the analysis into this report file
  sink(sfnam, split=TRUE)
  # processs it... into a new data.frame k1
  # blah blah blah...
  #
  write.csv(k1, file=ofnam, row.names=FALSE)
  sink() # turn off this particular report file
}
Run Code Online (Sandbox Code Playgroud)


小智 5

为了更好的替代问题:

我主要将R用于个别项目(意思是我是主要的分析师).但是,我们确实在有时需要与他人共享的项目中使用这些.

RStudio - 项目

我发现RStudio项目功能,走一段很长的路要走,以保持您的文件组织.如果其他用户也采用RStudio,他们将能够打开单个文件("*.Rproj")并让项目加载到您上次保存的相同状态.

ProjectTemplate

最重要的是,我发现了一个新的工具,ProjectTemplate更进一步!作者开发的技术用于为您正在做的事情提供结构.请访问网站了解更多详情.