首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在脚本中使用setwd()的风险?

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

Stack Overflow用户
提问于 2012-12-07 20:12:08
回答 6查看 10.9K关注 0票数 26

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

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

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-12-07 20:59:32

这是一个可复制代码的问题。如果您指定的目录不存在于其他人的计算机上,那么他们就不能使用您的代码。这对于绝对文件路径尤其糟糕,对于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

根据上述常见问题7:

最好不要在编织机代码块中更改工作目录。您的工作目录总是getwd() (所有输出文件都将在这里编写),但是代码块是在输入文档来自的目录下计算的。在运行R代码时更改工作目录通常是一种不好的做法。有关讨论,请参见第38号。您还应该尽可能地避免绝对目录(而不是使用相对目录),因为它降低了可复制性。

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

票数 31
EN

Stack Overflow用户

发布于 2012-12-07 20:35:05

我想不出在我管理的服务器上运行的脚本中使用setwd()有什么特别的问题,因为它确实返回了一个错误,这个错误可以用try()来捕获,并且您可以管理它。我在懒散路径时使用了setwd() --参见下面!

我在脚本制作或其他方面广泛使用file.path()。在输入目录中跨文件工作,并将输出图形和报表放到其他地方。所以一些类似..。(未经测试)使用setwd()会有些乏味。

代码语言:javascript
复制
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
}
票数 6
EN

Stack Overflow用户

发布于 2013-06-17 05:43:31

对于更好的替代方案问题:

我主要将R用于单个项目(这意味着我是主要的分析师)。然而,我们确实在有时需要与他人共享的项目中使用这些方法。

RStudio -项目

我发现RStudio's项目的功能是长路来保持文件的组织性。如果其他用户也采用RStudio,他们会有一种良好的感觉,能够打开单个文件("*.Rproj"),并将项目负载保持在上次保存到的状态。

ProjectTemplate

在此基础上,我找到了一个新工具,ProjectTemplate,它更进一步了!作者开发的技术用于为您所做的工作提供结构。请到网站了解更多细节。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13770304

复制
相关文章

相似问题

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