【问题标题】:R command for setting working directory to source file location in Rstudio用于在 Rstudio 中将工作目录设置为源文件位置的 R 命令
【发布时间】:2012-11-20 07:08:00
【问题描述】:

我正在编写一些 R 教程。每个 R 代码都包含在一个特定的文件夹中。里面有数据文件和其他文件。我想打开 .r 文件并获取它,这样我就不必更改 Rstudio 中的工作目录,如下所示:

有没有办法在 R 中自动指定我的工作目录。

【问题讨论】:

标签: r automation working-directory


【解决方案1】:

要获取源脚本的位置,您可以使用utils::getSrcDirectoryutils::getSrcFilename。因此,可以通过以下方式将工作目录更改为当前文件的目录:

setwd(getSrcDirectory()[1])

如果您运行代码而不是源代码,这在 RStudio 中不起作用。为此,您需要使用rstudioapi::getActiveDocumentContext

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

当然,第二种解决方案要求您使用 RStudio 作为 IDE。

【讨论】:

  • 您自己在stackoverflow.com/a/35842176/1247080 的答案有效(但必须包含目录名)。我加了
  • 请注意,当您在 RStudio 的控制台中运行 getActiveDocumentContext() 时,路径会报告为 ''。但是,如果您在编辑器部分运行代码行,它将按预期执行。这可能会解决@Andru 的评论
  • @giac_man 听起来您使用的是非常旧的 rstudioapi 软件包版本。尝试更新到最新版本。
  • setwd(getSrcDirectory()[1]) 在我获取文件时对我不起作用。 rstudioapi 解决方案有效。
  • @mjs 在控制台顶部,您应该会看到当前工作目录。右边是一个小箭头。单击该按钮可在文件浏览器中显示当前工作目录。
【解决方案2】:

我知道这个问题已经过时,但我也在寻找解决方案,Google 将其列在最顶部:

this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)

把它放到文件的某个地方(不过最好是开头),这样 wd 就会根据那个文件而改变。

根据 cmets 的说法,这可能不一定适用于每个平台(Windows 似乎可以工作,Linux/Mac 适合某些平台)。 请记住,此解决方案用于“采购”文件,不一定用于在该文件中运行块。

另见get filename and path of `source`d file

【讨论】:

  • 对我也不起作用:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
  • 这里的问题与 Linux 上的@Matt O'Brien 相同。
  • 如果有来源,工作完美。
  • 在 Windows 10 上的 RStudio v1.0.143 中为我工作。如果您选择“保存时的源”,它将正常工作(您可以使用“cat”打印出检测到的目录)。如果选择行然后执行它们,则结果为空。
  • 这适用于我在 Mac 上获取文件时。但是,正如@Contango 上面指出的那样,通过突出显示一个块并按Command + Return 以交互方式执行代码时,它将不起作用。在这种情况下,由于您没有获取文件,因此没有源文件可以从中提取工作目录。答案不需要指定特定于平台的警告。
【解决方案3】:
dirname(rstudioapi::getActiveDocumentContext()$path)

对我有用,但如果您不想使用 rstudioapi 并且您不在项目中,则可以在路径中使用符号 ~。符号 ~ 指的是默认的 RStudio 工作目录(至少在 Windows 上)。

如果您的 RStudio 工作目录是“D:/Documents”,setwd("~/proyect1") 与 setwd("D:/Documents/proyect1") 相同。

设置后,您可以导航到子目录:read.csv("DATA/mydata.csv")。与read.csv("D:/Documents/proyect1/DATA/mydata.csv")相同。

如果要导航到父文件夹,可以使用"../"。 例如:read.csv("../olddata/DATA/mydata.csv") 等同于read.csv("D:/Documents/oldata/DATA/mydata.csv")

无论您使用什么计算机,这都是我编写脚本的最佳方式。

【讨论】:

    【解决方案4】:

    对于rstudio,您可以像这样使用rstudioapi 自动将您的工作目录设置为脚本目录:

    library(rstudioapi)
    
    # Getting the path of your current open file
    current_path = rstudioapi::getActiveDocumentContext()$path 
    setwd(dirname(current_path ))
    print( getwd() )
    

    这在运行或获取文件时有效。

    您需要先安装包 rstudioapi。 请注意,我打印路径是为了 100% 确定我在正确的位置,但这是可选的。

    【讨论】:

    • setwd(dirname(current_path)) 中的错误:无法更改工作目录
    • @helmo 检查您的用户对目标目录是否有写权限。
    【解决方案5】:

    这个答案可以提供帮助:

    script.dir <- dirname(sys.frame(1)$ofile)
    

    注意:必须获取脚本才能返回正确的路径

    我发现它在:https://support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory-

    BumbleBee 的答案(使用 parent.frame 而不是 sys.frame)对我不起作用,我总是收到错误。

    【讨论】:

      【解决方案6】:

      解决办法

      dirname(parent.frame(2)$ofile)
      

      不适合我。

      我正在使用蛮力算法,但有效:

      File <- "filename"
      Files <- list.files(path=file.path("~"),recursive=T,include.dirs=T)
      Path.file <- names(unlist(sapply(Files,grep,pattern=File))[1])
      Dir.wd <- dirname(Path.file)
      

      搜索目录更容易:

      Dirname <- "subdir_name"
      Dirs <- list.dirs(path=file.path("~"),recursive=T)
      dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])
      

      【讨论】:

      • 这个解决方案的问题是速度很慢。搜索所有文件并存储在一个变量中也会占用大量内存。
      【解决方案7】:

      如果你在 Linux 上工作,你可以试试这个:

      setwd(system("pwd", intern = T) )

      它对我有用。

      【讨论】:

      • 这只是给出你的主目录(你的 shell 开始的地方)。
      • 它给出了你运行的脚本所在目录的路径。
      • pwd 代表当前工作目录。这会将目录设置为 shell 的当前目录。
      • pwd 也适用于 PowerShell(目前被认为是 Windows 上的默认 shell),它是 Get-Location 的别名。
      【解决方案8】:

      我意识到这是一个旧线程,但我遇到了类似的问题,需要设置工作目录并且无法获得任何适合我的解决方案。以下是有效的方法,以防其他人稍后偶然发现:

      # SET WORKING DIRECTORY TO CURRENT DIRECTORY:
      system("pwd=`pwd`; $pwd 2> dummyfile.txt")
      dir <- fread("dummyfile.txt")
      n<- colnames(dir)[2]
      n2 <- substr(n, 1, nchar(n)-1)
      setwd(n2)
      

      这有点复杂,但基本上这使用系统命令来获取工作目录并将其保存到 dummyfile.txt,然后 R 使用 data.table::fread 读取该文件。剩下的就是清理打印到文件中的内容,这样我就只剩下目录路径了。

      我需要在集群上运行 R,因此无法知道我最终会进入哪个目录(作业被分配了一个编号和一个计算节点)。这对我有用。

      【讨论】:

        【解决方案9】:

        here 包提供了here() 函数,它根据一些启发式方法返回您的项目根目录。

        不是完美的解决方案,因为它找不到脚本的位置,但它足以满足某些目的,所以我想我会把它放在这里。

        【讨论】:

        • 感谢您的回答。可以通过在源代码中调用 here::set_here() 来利用当前脚本的位置。
        【解决方案10】:

        我知道这已经过时了,但我无法让以前的答案非常令人满意地工作,所以我想贡献我的方法,以防其他人遇到 cmets 中提到的 BumbleBee 答案中提到的相同错误。

        我的基于一个简单的系统命令。您提供的所有功能都是脚本的名称:

        extractRootDir <- function(x) {
            abs <- suppressWarnings(system(paste("find ./ -name",x), wait=T, intern=T, ignore.stderr=T))[1];
            path <- paste("~",substr(abs, 3, length(strsplit(abs,"")[[1]])),sep="");
            ret <- gsub(x, "", path);
            return(ret);
        }
        
        setwd(extractRootDir("myScript.R"));
        

        函数的输出看起来像"/Users/you/Path/To/Script"。希望这可以帮助其他可能陷入困境的人。

        【讨论】:

          【解决方案11】:

          我只是在寻找解决这个问题的方法,来到这个页面。我知道它过时了,但以前的解决方案不满意或对我不起作用。如果有兴趣,这是我的工作。

          filename = "your_file.R"
          filepath = file.choose()  # browse and select your_file.R in the window
          dir = substr(filepath, 1, nchar(filepath)-nchar(filename))
          setwd(dir)
          

          【讨论】:

          • 你有理由不只使用setwd( dirname(filepath) ) 吗?
          【解决方案12】:

          如果您使用 UTF-8 编码:

          path <- rstudioapi::getActiveDocumentContext()$path
          Encoding(path) <- "UTF-8"
          setwd(dirname(path))
          

          如果您还没有安装包 rstudioapi,则需要安装。

          【讨论】:

          • setwd(dirname(path)) 中的错误:无法更改工作目录
          • ``` setwd(dirname(path)) 中的错误:无法更改工作目录`` 您的解决方案不起作用,请检查您的答案
          【解决方案13】:

          大多数 GUI 假定如果您在一个目录中并“打开”、双击或以其他方式尝试执行 .R 文件,除非另有说明,否则它所在的目录将是工作目录。 Mac GUI 提供了一种更改默认行为的方法,该默认行为可在您在运行会话中设置的首选项的启动面板中更改,并在下一次“启动”时生效。你还应该看看:

          ?Startup
          

          RStudio 文档说:

          “通过文件关联启动时,RStudio 会自动将工作目录设置为打开文件的目录。”默认设置是将 RStudio 注册为 .R 文件的处理程序,尽管也提到了为 .Rdata 和 .R 扩展设置与 RStudio 的默认“关联”的能力。 Linux 上的“处理程序”状态和“关联”状态是否相同,我无法确定。

          http://www.rstudio.com/ide/docs/using/workspaces

          【讨论】:

          • 肯定 RStudio 不会做出这样的假设。
          • 它的行为方式与我在机器上描述的方式相同。我没有对 RStudio Preferences 做任何特别的事情。
          • 在 Linux 上不这样做 :)
          • “当通过文件关联启动时”是这里的关键条件。有些人可能会通过终端中的快捷方式或命令启动 Rstudio。您需要打开文件并将打开 .R 文件的默认设置为 Rstudio。如果您先打开 Rstudio(然后打开文件),它将无法按描述工作。通过文件关联,上述答案适用于 windows 和 mac(可能不是 linux,正如@nico 指出的那样 - 但我无法验证这一点,因为我没有 linux 机器)。
          【解决方案14】:
          dirname(parent.frame(2)$ofile)  
          

          对我也不起作用,但以下内容(如 https://stackoverflow.com/a/35842176/992088 中所建议)在 ubuntu 14.04 中对我有用

          dirname(rstudioapi::getActiveDocumentContext()$path)
          

          【讨论】:

          • Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi' 也在 Ubuntu 14.04 中
          • 或许你可以先尝试安装rstudioapi包。
          • 这很奇怪。我在 32 位 ubuntu 14.04 中使用 R-3.2.4。我希望不是因为操作系统或不同版本的 R。
          【解决方案15】:

          这是另一种方法:

          set2 <- function(name=NULL) {
            wd <- rstudioapi::getSourceEditorContext()$path
            if (!is.null(name)) {
              if (substr(name, nchar(name) - 1, nchar(name)) != '.R') 
                name <- paste0(name, '.R')
            }
            else {
              name <- stringr::word(wd, -1, sep='/')
            }
            wd <- gsub(wd, pattern=paste0('/', name), replacement = '')
            no_print <- eval(expr=setwd(wd), envir = .GlobalEnv)
          }
          set2()
          

          【讨论】:

            【解决方案16】:

            我觉得自己像只知更鸟,但我要说:我知道这篇文章很旧,但是......

            我最近才了解到,在从任务计划程序和 .bat 文件运行脚本时,您无法调用 api。我经过惨痛的教训才学到这个。认为那些使用任何 rstudioapi:: 方法的人可能想知道这一点。我们以这种方式在一夜之间运行了很多脚本。最近刚刚更改了我们的路径以包含调用的 api,以便我们可以“动态”设置工作目录。然后,当我们尝试的第一个尝试在任务计划程序触发时失败时,调查带来了该信息。

            这是揭示此问题的实际代码:
            setwd(dirname(rstudioapi::getActiveDocumentContext()$path))

            如果您正在运行脚本,效果会非常好!

            只需加上我的两分钱,因为我知道人们仍然会拉起这些线程,认为这可能会有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-06-21
              • 2017-11-16
              • 2015-04-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-05-06
              • 1970-01-01
              相关资源
              最近更新 更多