Получение пути к скрипту R
есть ли способ программно найти путь R-скрипта внутри самого скрипта?
Я спрашиваю это потому, что у меня есть несколько скриптов, которые используют RGtk2
и загрузите графический интерфейс из a .файл поляны.
В этих скриптах я обязан поставить setwd("path/to/the/script")
инструкция в начале, в противном случае.файл glade (который находится в том же каталоге) не будет найден.
Это нормально, но если я переместить скрипт в другой каталог или на другой компьютер я придется менять путь. Я знаю, это не большое дело, но было бы неплохо иметь что-то вроде:
setwd(getScriptPath())
Итак, существует ли подобная функция?
8 ответов:
это работает для меня:
getSrcDirectory(function(x) {x})
это определяет анонимную функцию (которая ничего не делает) внутри скрипта, а затем определяет исходный каталог этой функции, который является каталогом, в котором находится скрипт.
только для RStudio:
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
это работает, когда выполнитьНин или источниктвой файл.
используйте неявный аргумент "--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) }
если вы обернете свой код в пакет, вы всегда можете запросить части каталога пакетов.
Вот пример из пакета RGtk2:> system.file("ui", "demo.ui", package="RGtk2") [1] "C:/opt/R/library/RGtk2/ui/demo.ui" >
вы можете сделать то же самое с каталогом
inst/glade/
в ваших источниках, которые станут каталогомglade/
в установленном пакете -- иsystem.file()
будет вычислять путь для вас при установке, независимо от ОС.
этот ответ Отлично работает для меня:
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.рама(1)$ofile. Я ничего не нашел об этом в документации R. Кто-то может это объяснить?
#' current script dir #' @param #' @return #' @examples #' works with source() or in RStudio Run selection #' @export z.csd <- function() { # http://stackoverflow.com/questions/1815606/rscript-determine-path-of-the-executing-script # 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 }
Как насчет использования команд system и shell? С windows one, я думаю, когда вы открываете скрипт в RStudio, он устанавливает текущий каталог оболочки в каталог скрипта. Возможно, вам придется добавить cd C:\ e.g или любой другой диск, который вы хотите найти (например, shell('dir C:\\*file_name /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)