我听说它说在脚本中使用setwd()是不好的做法。
发布于 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号。您还应该尽可能地避免绝对目录(而不是使用相对目录),因为它降低了可复制性。
发布于 2012-12-07 20:35:05
我想不出在我管理的服务器上运行的脚本中使用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
}发布于 2013-06-17 05:43:31
对于更好的替代方案问题:
我主要将R用于单个项目(这意味着我是主要的分析师)。然而,我们确实在有时需要与他人共享的项目中使用这些方法。
RStudio -项目
我发现RStudio's项目的功能是长路来保持文件的组织性。如果其他用户也采用RStudio,他们会有一种良好的感觉,能够打开单个文件("*.Rproj"),并将项目负载保持在上次保存到的状态。
ProjectTemplate
在此基础上,我找到了一个新工具,ProjectTemplate,它更进一步了!作者开发的技术用于为您所做的工作提供结构。请到网站了解更多细节。
https://stackoverflow.com/questions/13770304
复制相似问题