Получение пути R-скрипта - PullRequest
       7

Получение пути R-скрипта

59 голосов
/ 10 августа 2010

Есть ли способ программно найти путь сценария R внутри самого сценария?

Я спрашиваю об этом, потому что у меня есть несколько сценариев, которые используют RGtk2 и загружают графический интерфейс из файла .glade.

В этих скриптах я обязан поместить инструкцию setwd("path/to/the/script") в начале, иначе файл .glade (который находится в том же каталоге) не будет найден.

Этохорошо, но если я перенесу скрипт в другой каталог или на другой компьютер, мне придется изменить путь.Я знаю, это не имеет большого значения, но было бы неплохо иметь что-то вроде:

setwd(getScriptPath())

Итак, существует ли подобная функция?

Ответы [ 8 ]

36 голосов
/ 18 мая 2015

Это работает для меня:

getSrcDirectory(function(x) {x})

Это определяет анонимную функцию (которая ничего не делает) внутри скрипта, а затем определяет исходный каталог этой функции, который является каталогом, в котором находится скрипт.

26 голосов
/ 07 марта 2016

Только для RStudio:

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

Это работает, когда Запускает ning или Источник в вашем файле.

24 голосов
/ 13 августа 2010

Использование source("yourfile.R", chdir = T)

6 голосов
/ 03 июня 2014

Использование неявного аргумента "--file" в Rscript

При вызове скрипта с использованием «Rscript» ( Rscript doc ) полный путь к скрипту указывается в качестве системного параметра. Следующая функция использует это для извлечения каталога скриптов:

getScriptPath <- function(){
    cmd.args <- commandArgs()
    m <- regexpr("(?<=^--file=).+", cmd.args, perl=TRUE)
    script.dir <- dirname(regmatches(cmd.args, m))
    if(length(script.dir) == 0) stop("can't determine script dir: please call the script with Rscript")
    if(length(script.dir) > 1) stop("can't determine script dir: more than one '--file' argument detected")
    return(script.dir)
}
4 голосов
/ 10 августа 2010

Если вы упаковываете свой код в пакет, вы всегда можете запросить части каталога пакета.
Вот пример из пакета RGtk2:

> system.file("ui", "demo.ui", package="RGtk2")
[1] "C:/opt/R/library/RGtk2/ui/demo.ui"
> 

Вы можете сделать то же самое с каталогом inst/glade/ в ваших источниках, который станет каталогом glade/ в установленном пакете - и system.file() вычислит путь для вас при установке, независимо от ОС.

3 голосов
/ 26 апреля 2015

Этот ответ мне подходит:

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-

Но я все еще не понимаю, что такое sys.frame (1) $ ofile.Я не нашел ничего об этом в документации R.Кто-то может это объяснить?

1 голос
/ 18 марта 2016
#' current script dir
#' @param
#' @return
#' @examples
#' works with source() or in RStudio Run selection
#' @export
z.csd <- function() {
    # /976002/opredelit-put-k-ispolnyaemomu-skriptu
    # must work with source()
    if (!is.null(res <- .thisfile_source())) res
    else if (!is.null(res <- .thisfile_rscript())) dirname(res)
    # http://stackoverflow.com/a/35842176/2292993  
    # RStudio only, can work without source()
    else dirname(rstudioapi::getActiveDocumentContext()$path)
}
# Helper functions
.thisfile_source <- function() {
    for (i in -(1:sys.nframe())) {
        if (identical(sys.function(i), base::source))
            return (normalizePath(sys.frame(i)$ofile))
    }

    NULL
}
.thisfile_rscript <- function() {
    cmdArgs <- commandArgs(trailingOnly = FALSE)
    cmdArgsTrailing <- commandArgs(trailingOnly = TRUE)
    cmdArgs <- cmdArgs[seq.int(from=1, length.out=length(cmdArgs) - length(cmdArgsTrailing))]
    res <- gsub("^(?:--file=(.*)|.*)$", "\\1", cmdArgs)

    # If multiple --file arguments are given, R uses the last one
    res <- tail(res[res != ""], 1)
    if (length(res) > 0)
        return (res)

    NULL
}
0 голосов
/ 08 июля 2017

Как насчет использования системных команд и команд оболочки?С Windows One, я думаю, что когда вы открываете скрипт в RStudio, он устанавливает текущий каталог оболочки в каталог скрипта.Возможно, вам придется добавить cd C: \ например или любой другой диск, который вы хотите найти (например, shell ('dir C: \\ * имя_файла / s', intern = TRUE) - \\ для экранирования escape-символа).Будет работать только для файлов с уникальными именами, если вы не укажете дополнительные подкаталоги (для Linux я начал поиск с /).В любом случае, если вы знаете, как найти что-то в оболочке, это обеспечивает компоновку, чтобы найти это в R и вернуть каталог.Должно работать, независимо от того, используете ли вы скрипт или запускаете скрипт, но я не полностью изучил потенциальные ошибки.

#Get operating system
OS<-Sys.info()
win<-length(grep("Windows",OS))
lin<-length(grep("Linux",OS))

#Find path of data directory
#Linux Bash Commands
if(lin==1){
  file_path<-system("find / -name 'file_name'", intern = TRUE)
  data_directory<-gsub('/file_name',"",file_path)
}
#Windows Command Prompt Commands
if(win==1){
  file_path<-shell('dir file_name /s', intern = TRUE)
  file_path<-file_path[4]
  file_path<-gsub(" Directory of ","",file_path)
  filepath<-gsub("\\\\","/",file_path)
  data_directory<-file_path
}

#Change working directory to location of data and sources  
setwd(data_directory)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...