如何在R编程中将当前文件位置设置为默认工作目录?

时间:2016-01-29 00:39:05

标签: r setwd

我想将当前文件位置作为工作目录。

使用Rstudio(Works!):

# Author  : Bhishan Poudel
# Program : writehere.r
# Source  : Rscript writehere.r

# set working directory here
this.dir <- dirname(parent.frame(2)$ofile) # frame(3) also works.
setwd(this.dir)

# Sample data to test this code
mydata <- seq(1:10)
write.csv(mydata,"writehere.dat")
#This works flawlessly in  MacOS 10.9 and Ubuntu 15.1.

使用终端命令:Rscript writehere.r(不起作用!)

Error in dirname(parent.frame(2)$ofile) : 
  a character vector argument expected
Execution halted


------------------
(program exited with code: 1)

使用终端命令:Rscript writehere.r(立即使用!)

# Author  : Bhishan Poudel
# Program : writehere.r
# Source  : Rscript example.r

# set working directory here
this_dir <- function(directory)
setwd( file.path(getwd(), directory) )

# Sample data to test this code
mydata <- seq(1:10)
write.csv(mydata,"writehere.dat")

在〜/ .Rprofile里面使用Rstudio(Works!)中的函数:

##############################################
# inside ~/.Rprofile
# set up working directory
setwd_thisdir <- function () {
  this.dir <- dirname(parent.frame(3)$ofile)
  setwd(this.dir)
} 
##############################################

然后,在任何目录中,让我们说我有一个文件writehere.r,现在它可以工作了。

# Author  : Bhishan Poudel
# Program : writehere.r
# Compile : Rscript writehere.r

# set working directory here
setwd_thisdir

# Sample data to test this code
mydata <- seq(1:10)
write.csv(mydata,"writehere.dat")

问题: 为什么功能

this.dir <- dirname(parent.frame(2)$ofile) # frame(3) also works.
setwd(this.dir)

对Rstudio以外的文本编辑器不起作用吗?

以下是一些有用的链接:
R setting working directory to source file location?
R command for setting working directory to source file location
 get filename and path of `source`d file
setwd() in the current working dir
Command for "Set working directory to source file location"
SublimeText and R: Setting Current File Directory
Setting working directory through a function
What is a fool-proof way of permanently setting R working directory?
R setting working directory to source file location?
How to get into the directory of a file in R?

5 个答案:

答案 0 :(得分:1)

尝试在您的函数中使用parent.frame(3)

setwd_thisdir <- function () {
  this.dir <- dirname(parent.frame(3)$ofile)
  setwd(this.dir)
}

请参阅?parent.framehttp://adv-r.had.co.nz/Environments.html#calling-environments

您还可以查看chdir函数的source选项(?source)。

答案 1 :(得分:1)

更新:我意识到这个答案根本没有帮助,我会发布另一个能够解决这个问题的答案。

就你想要运行的代码不需要任何其他参数而言,如下所示的解决方案,使用eval(expr, envir)可能会有所帮助。

使用print(environment())考虑以下示例,在命令行上使用时应返回environment: R_GlobalEnv。函数test_1将打印有关调用函数时创建的内部环境的信息,而函数test_2将返回所需的结果。

test_1 <- function(){
     print(environment())
}

test_2 <- function(){
    .expr <- quote({
        print(environment())
        })
    .envir <- sys.frame(which = -1)
    eval(expr = .expr,
         envir = .envir)
}

sys.frame(which = -1)确保在调用函数的环境中计算表达式。如果您确定始终想要使用全局环境,那么使用.GlobalEnv会更好。引用您想要使用的表达式也很重要,否则它可能无法正常工作。

此解决方案的一个很好的功能是,您不需要调整要放入​​函数的代码,只需引用它即可。

最后:可以扩展这种方法,以便您的函数可以获取参数,然后将该参数提供给您想要在另一个环境中评估的代码。然而,这需要对要评估的表达式进行一些非平凡的调整;您可能需要使用bquote + .()构造 - 此外,您还可能需要使用calldo.call

答案 2 :(得分:1)

我给出的第一个答案完全错过了这一点,因为我没有 密切关注你想要达到的目标。解决方案 这里介绍的应该是诀窍。

首先请注意,source的参数chdir在帮助文件中描述为:logical;如果TRUEfile是路径名,则R工作目录会暂时更改为包含file的目录以进行评估。

每次要获取文件时手动指定该参数 将是一个痛苦,所以让我们添加一些东西来改变.Rprofile chdirFALSETRUE的默认值。

formals - 函数可用于修改默认值 值,但在用于属于其他函数的函数时 在环境中,结果将是创建函数的本地副本。那还不够好。

可能有几种方法可以解决这个问题,但以下几点 当我将它插入.Rprofile时,source的小黑客为我做了诀窍。

.temporary_copy_source <- base::source
formals(.temporary_copy_source)$chdir <- TRUE
utils::assignInNamespace(
    x = "source",
    value = .temporary_copy_source,
    ns = environment(source))
rm(.temporary_copy_source)

警告:此处介绍的方法原则上可以 允许用户修改任何参数中的任何参数的默认值 功能,但这是一个非常糟糕的主意。保持 请记住,您的脚本可能稍后会与某人共享 你没有相同的.Rprofile。 永远不要写 需要对名称空间进行此类修改的代码!

答案 3 :(得分:1)

简单地,使用rstudio API,提取其目录,并将其设置为工作目录,如下所示:

setwd(dirname(rstudioapi::getSourceEditorContext()$path))

验证是否通过以下命令正确设置了目录:

getwd()

答案 4 :(得分:0)

我写了另一个答案因为你改变了你的问题。有两个有用的事实:

  1. ofilesource函数环境中的变量,因此只有在使用source函数运行某些脚本时才能使用它。
  2. 当您从终端运行脚本时,工作目录将设置为终端中的当前目录。
  3. 所以,评论你的意见:

    1. 使用Rstudio(Works!)。如果按 Source (使用source功能),则为是,但是如果按运行(仅运行R控制台中的命令)则不会。< / LI>
    2. Rscript writehere.r(不起作用!)。那是因为您在没有拨打ofile的情况下正在寻找source
    3. Rscript writehere.r(立即行动!)。是的,但它仅仅通过事实2 起作用:代码this_dir <- function(directory) setwd( file.path(getwd(), directory) )是不必要的,因为它只是名为this_dir的函数的定义。
    4. Rstudio(作品!)。第一部分:好的。第二部分。它仅适用于 fact 2 。特别是setwd_thisdir是不必要的,因为它只是将setwd_thisdir的主体打印到控制台。
    5. 总结setwd(dirname(parent.frame(2)$ofile))是一个有用的技巧,当您使用source函数来源脚本,但无权访问source函数选项时:在R-Studio中按 Source 时。如果可能,请使用source函数和chdir=TRUE。如果您运行脚本,终端只需将终端设置为脚本文件夹。