Określ ścieżkę skryptu wykonawczego

255

Mam skrypt o nazwie, foo.Rktóry zawiera inny skrypt other.R, który znajduje się w tym samym katalogu:

#!/usr/bin/env Rscript
message("Hello")
source("other.R")

Ale chcę Rto stwierdzić other.Rbez względu na bieżący katalog roboczy.

Innymi słowy, foo.Rmusi znać własną ścieżkę. Jak mogę to zrobić?

Szczery
źródło
2
Nie.: Nie widziałem żadnego rozwiązania, które faktycznie działałoby. Oprócz obejścia można po prostu przekazać katalog lub użyć zmiennej środowiskowej.
Frank
3
Byłoby niesamowite, gdyby skrypty były w pełni przenośne i mogły być wykonywane nawet przez R neofites!
Etienne Low-Décarie
4
Wygląda na to, że wszystkie odpowiedzi wymagają wprowadzenia ścieżki w pewnym momencie (przynajmniej do źródła pliku)! Byłoby wspaniale, gdybyś mógł wysłać komuś skompresowany folder i uruchomić dowolny plik skryptu R w tym folderze, aby odczytać i zapisać w tym folderze.
Etienne Low-Décarie
10
ten pojedynczy problem może stać się powodem, dla którego mógłbym całkowicie przejść do Pythona
Giacomo,
5
@giac_man, czuję, że R jest pełen setek takich drobnych problemów, z których wszystkie bardzo utrudniają pracę.
Michael Barton

Odpowiedzi:

102

Tutaj jest proste rozwiązanie problemu. To polecenie:

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

zwraca ścieżkę bieżącego pliku skryptu. Działa po zapisaniu skryptu.

this.is.not.a.nick
źródło
4
To nie działa dla mnie. Używam R w Windows. Dowolny pomysł?
Ehsan88
4
Wystąpił ten sam błąd, z zapisanym skryptem, świeżo zainstalowanym i uruchomionym R 3.2.0 na
Windowsie
27
Ten błąd występuje, gdy próbujesz wykonać dirname(sys.frame(1)$ofile)bezpośrednio z Rstudio. Działa dobrze, gdy skrypt jest wykonywany przy użyciu źródła („other.R”) i dirname(sys.frame(1)$ofile)jest w środku "other.R".
Murta
4
Podczas wywoływania jako skryptu za pomocą rscript.exe wystąpił błąd „nie tak wiele ramek na stosie”, tzn. Nie korzystałem z source (). więc musiałem zamiast tego skorzystać z rozwiązania z Suppressingfire poniżej
Mark Adamson,
3
I żel NULLgdy ten znajduje się w server.R podczas korzystania błyszczące
Paul
75

Możesz użyć tej commandArgsfunkcji, aby pobrać wszystkie opcje przekazane przez Rscript do rzeczywistego interpretera języka R i wyszukać je --file=. Jeśli skrypt został uruchomiony ze ścieżki lub jeśli został uruchomiony z pełną ścieżką, script.nameponiżej rozpocznie się od '/'. W przeciwnym razie musi być względna cwdi można połączyć dwie ścieżki, aby uzyskać pełną ścieżkę.

Edycja: brzmi tak, jakbyś potrzebował tylko script.namepowyższego i zdjął ostatni element ścieżki. Usunąłem niepotrzebną cwd()próbkę, wyczyściłem główny skrypt i opublikowałem mój other.R. Po prostu zapisz ten skrypt i other.Rskrypt w tym samym katalogu chmod +xi uruchom skrypt główny.

main.R :

#!/usr/bin/env Rscript
initial.options <- commandArgs(trailingOnly = FALSE)
file.arg.name <- "--file="
script.name <- sub(file.arg.name, "", initial.options[grep(file.arg.name, initial.options)])
script.basename <- dirname(script.name)
other.name <- file.path(script.basename, "other.R")
print(paste("Sourcing",other.name,"from",script.name))
source(other.name)

other.R :

print("hello")

wyjście :

burner@firefighter:~$ main.R
[1] "Sourcing /home/burner/bin/other.R from /home/burner/bin/main.R"
[1] "hello"
burner@firefighter:~$ bin/main.R
[1] "Sourcing bin/other.R from bin/main.R"
[1] "hello"
burner@firefighter:~$ cd bin
burner@firefighter:~/bin$ main.R
[1] "Sourcing ./other.R from ./main.R"
[1] "hello"

Tego właśnie szuka Dehmann.

Tłumienie ognia
źródło
Co jest z downmod?
Suppressingfire
2
Zmodyfikowałem, ponieważ twoja technika nie działa sourcetak, jak myślałem, że OP chce - ale może źle zrozumiałem jego / jej wymagania. Ale nie mogę cofnąć downmodu :( Przepraszamy!
hadley
Ale tak naprawdę działa dobrze ze źródłem! Po prostu source (other.name) i działa poprawnie.
Suppressingfire,
3
Do połączenia ścieżki lepiej użyćother.name <- file.path(script.basename, "other.R")
Jason
1
Kiedy próbuję uruchomić commandArgs(trailingOnly = FALSE)serwer server.R w błyszczącej aplikacji, dostaję [1] "RStudio" "--interactive". Brak informacji o katalogu, z którego został wywołany.
Paul
57

Nie mogłem zmusić rozwiązania Suppressingfire do działania, gdy „źródło” pochodziło z konsoli R.
Nie mogłem zmusić rozwiązania Hadley do działania podczas korzystania z Rscript.

Najlepsze z obu światów?

thisFile <- function() {
        cmdArgs <- commandArgs(trailingOnly = FALSE)
        needle <- "--file="
        match <- grep(needle, cmdArgs)
        if (length(match) > 0) {
                # Rscript
                return(normalizePath(sub(needle, "", cmdArgs[match])))
        } else {
                # 'source'd via R console
                return(normalizePath(sys.frames()[[1]]$ofile))
        }
}
parowiec 25
źródło
6
Podoba mi się to, ponieważ działa z obiema Rscripti source()wewnątrz R. Sugerowałbym zrobienie normalizePath()obu wersji, aby w obu przypadkach zapewniała pełną ścieżkę.
wch
1
To jedyna rzecz, która zadziałała. Uwaga, aby to zadziałało, library(base)zajęło mi trochę czasu, aby dowiedzieć się, że lol
O.rka
2
proszę pana, głosowałem, ponieważ to rozwiązanie, które zadziałało dla mnie
Vince W.
1
Jeśli to pomoże nikogo, do oryginalnego postu, to oznaczałoby source(file.path(dirname(thisFile()), "other.R"))w foo.R. To działa dla mnie.
Kim
Jeden problem. Załóżmy w RStudio I źródło, main.Rktóre źródła, helper.Rktóre wywołuje thisFile(). Spowoduje to pobranie ścieżki main.Rzamiast helper.R. Wszelkie wskazówki tutaj?
Wassadamo,
37
frame_files <- lapply(sys.frames(), function(x) x$ofile)
frame_files <- Filter(Negate(is.null), frame_files)
PATH <- dirname(frame_files[[length(frame_files)]])

Nie pytaj mnie, jak to działa, ponieważ zapomniałem: /

Hadley
źródło
2
W jakim kontekście to działa? print (sys.frames ()) wyświetla NULL po uruchomieniu.
Suppressingfire
1
@Suppressingfire: sys.frameszwraca środowiska stosu wywołań, więc ma to sens tylko wtedy, gdy jest wywoływane z funkcji. Spróbuj np foo <- function() {bar <- function() print(sys.frames()); bar()}; foo(). Nie mogę jednak rozgryźć kodu @ hadley, ponieważ środowiska nie mają ofileczłonka.
Richie Cotton
1
Musisz go pobrać - tzn. Jeśli zapiszę ten kod, a następnie uruchomię source("~/code/test.r"), PATHzostanie ustawiony na ~/desktop. Jeśli tylko ocenisz go na najwyższym poziomie, zwróci NULL.
hadley
4
To nie odpowiada na moje pytanie. Muszę automatycznie znaleźć plik „other.R”. x$ofilejest niezdefiniowany, więc frame_filesjest pusty.
Frank,
@adley, bardzo przydatny kod. Udało mi się uogólnić funkcję narzędzia „przeładuj bieżący skrypt”, którą dodałem do prawie wszystkich skryptów, gdy są one w fazie programowania. Reloader RScript
Sim
29

To działa dla mnie

library(rstudioapi)    
rstudioapi::getActiveDocumentContext()$path
ColinTea
źródło
4
To chyba działa tylko z poziomu RStudio. Próbuję z terminala Error: RStudio not running.
Ista
dokładniej działa, jeśli jest uruchamiany ze skryptu R w studio R. Nawet na konsoli w RStudio nie da to właściwego wyniku ""w moim przypadku
Kay
26

Odpowiedź rakensi z Pierwsze ścieżki skryptu R jest najbardziej poprawna i naprawdę genialna IMHO. Jednak wciąż jest to hack z funkcją manekina. Cytuję to tutaj, aby inni mogli łatwiej to znaleźć.

sourceDir <- getSrcDirectory (function (dummy) {dummy})

Daje to katalog pliku, w którym została umieszczona instrukcja (w którym zdefiniowano funkcję fikcyjną). Następnie można go użyć do ustawienia katalogu roboczego i ścieżek względnych, np

setwd(sourceDir)
source("other.R")

lub stworzyć ścieżki bezwzględne

 source(paste(sourceDir, "/other.R", sep=""))
mankiet
źródło
1
Dla mnie twoje rozwiązanie było najlepsze. Zwłaszcza dlatego, że można go zastosować do aplikacji Błyszczące, a ta nie na link.
jcarlos 18.04.16
1
Tutaj getSrcDirectory to utils :: getSrcDirectory
RubenLaguna,
5
To może ładnie działać w systemie Linux / Mac, ale nie działało to dla mnie podczas interaktywnej sesji RStudio w systemie Windows. sourceDirbyło puste.
Contango,
1
@Contango na interaktywnym terminalu, nie ma ścieżki !!! Chcesz ścieżkę do pliku.
pommedeterresautee
1
Dostaję character(0). Propozycje?
abalter
16

Moje wszystko w jednym! (--01 / 09/2019 zaktualizowany w celu obsługi konsoli RStudio)

#' current script file (in full path)
#' @description current script file (in full path)
#' @examples
#' works with Rscript, source() or in RStudio Run selection, RStudio Console
#' @export
ez.csf <- function() {
    # http://stackoverflow.com/a/32016824/2292993
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (length(match) > 0) {
        # Rscript via command line
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName))
        } else {
            if (!is.null(sys.frames()[[1]]$ofile)) {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
            } else {
                # RStudio Run Selection
                # http://stackoverflow.com/a/35842176/2292993
                pth = rstudioapi::getActiveDocumentContext()$path
                if (pth!='') {
                    return(normalizePath(pth))
                } else {
                    # RStudio Console
                    tryCatch({
                            pth = rstudioapi::getSourceEditorContext()$path
                            pth = normalizePath(pth)
                        }, error = function(e) {
                            # normalizePath('') issues warning/error
                            pth = ''
                        }
                    )
                    return(pth)
                }
            }
        }
    }
}
Jerry T.
źródło
Nie działa z interaktywną sesją R. Dostaję: ``> source ("csf.R")> csf () Błąd: RStudio nie działa ``
ManicMailman
To jest świetne. Czy ktoś może zrobić paczkę?
Joe Flack
13

Odchudzony wariant odpowiedzi Supressingfire:

source_local <- function(fname){
    argv <- commandArgs(trailingOnly = FALSE)
    base_dir <- dirname(substring(argv[grep("--file=", argv)], 8))
    source(paste(base_dir, fname, sep="/"))
}
momeara
źródło
To nie działało rekurencyjnie; źródłowy plik szuka pliku danych (ale w niewłaściwym katalogu).
Kot Unfun
11

To działa dla mnie. Po prostu wyłapuje go z argumentów wiersza poleceń, usuwa niechciany tekst, robi nazwę katalogu i w końcu uzyskuje pełną ścieżkę z tego:

args <- commandArgs(trailingOnly = F)  
scriptPath <- normalizePath(dirname(sub("^--file=", "", args[grep("^--file=", args)])))
eddi
źródło
8

Skompletowałem i rozszerzyłem odpowiedzi na to pytanie do nowej funkcji thisfile()w rprojroot . Działa również na drutach knitr.

krlmlr
źródło
6

Podobało mi się rozwiązanie steamer25, ponieważ wydaje się najbardziej niezawodne do moich celów. Jednak podczas debugowania w RStudio (w systemie Windows) ścieżka nie zostanie ustawiona poprawnie. Powodem jest to, że jeśli w RStudio ustawiony jest punkt przerwania, w źródle pliku używana jest alternatywna komenda „źródło debugowania”, która nieco inaczej ustawia ścieżkę skryptu. Oto ostateczna wersja, której obecnie używam, która dotyczy tego alternatywnego zachowania w RStudio podczas debugowania:

# @return full path to this script
get_script_path <- function() {
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (length(match) > 0) {
        # Rscript
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName)) 
        } else {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
        }
    }
}
aprstar
źródło
źródło w Rstudio dało mi forile, ale debugSource dało fileName, więc twoje rozwiązanie działa dobrze, ale w moim przypadku komentarze do kodu nie są w porządku
Mark Adamson
6

Próbowałem prawie wszystkiego z tego pytania, Uzyskiwanie ścieżki skryptu R , Uzyskiwanie ścieżki bieżącego skryptu , Znajdź lokalizację bieżącego pliku .R i polecenia R do ustawienia katalogu roboczego na lokalizację pliku źródłowego w Rstudio , ale na końcu znalazłem się ręcznie przeglądanie tabeli CRAN i znalezione

scriptName biblioteka

która udostępnia current_filename()funkcję, która zwraca prawidłową pełną ścieżkę skryptu podczas pobierania w RStudio, a także podczas wywoływania za pomocą pliku wykonywalnego R lub RScript.

Bojan P.
źródło
1
Package ‘scriptName’ was removed from the CRAN repository.- co teraz? : o
Bojan P.
3

Miałem również ten problem i żadne z powyższych rozwiązań nie działało dla mnie. Może zsource takimi lub podobnymi rzeczami, ale nie było to wystarczająco jasne.

Dla mnie to eleganckie rozwiązanie:

paste0(gsub("\\", "/", fileSnapshot()$path, fixed=TRUE),"/")

Ważną rzeczą jest to, fileSnapshot()że daje wiele informacji o pliku. Zwraca listę 8 elementów. Po wybraniu pathjako elementu listy ścieżka jest zwracana za pomocą\\ jako separator, więc reszta kodu jest po prostu to zmienić.

Mam nadzieję, że to pomoże.

Antoine
źródło
1
Nie działało to dla mnie na komputerze z systemem Linux; zamiast zwracać ścieżkę do pliku, zwrócił katalog, w którym aktualnie się znajdowałem. Utworzyłem skrypt testowy o nazwie TEST.R z jednym wierszem kodu: print (fileSnapshot () $ path) Zapisałem go w tym folderze: / opt / home / boops / Desktop / Testfolder / TEST.RI następnie nawigowałem na mój pulpit i próbowałem uruchomić plik: boops @ linuxserver: ~ / Desktop $ Rscript /opt/home/boops/Desktop/Testfolder/TEST.R [1 ] "/ opt / home / boops / Desktop"
Boops Boops
Dla mnie też nie działało. Zwraca to samo, co „here ()” podczas korzystania z biblioteki „here”. Zwróciło ścieżkę do mojego obecnie otwartego projektu R. Ale nie sam plik jest wykonywany.
Joe Flack
2

Możesz owinąć skrypt rw skrypt bash i pobrać ścieżkę skryptu jako zmienną bash w następujący sposób:

#!/bin/bash
     # [environment variables can be set here]
     path_to_script=$(dirname $0)

     R --slave<<EOF
        source("$path_to_script/other.R")

     EOF
ennuikiller
źródło
3
Wymaga to posiadania ścieżki skryptu. Nie pozwala ci stworzyć prawdziwie przenośnego skryptu R, który można uruchomić z dowolnego miejsca.
Etienne Low-Décarie
@ EtienneLow-Décarie Nie wymaga ścieżki skryptu, pobiera ją z bash. Głównym problemem jest to, że nie jest to niezawodny sposób na uzyskanie ścieżki. Preferowane jest coś takiego, jak w stackoverflow.com/questions/59895/… path_to_script = "$ (cd" $ (dirname "$ {BASH_SOURCE [0]}") "&& pwd)"
John Haberstroh
2

Podoba mi się to podejście:

this.file <- sys.frame(tail(grep('source',sys.calls()),n=1))$ofile
this.dir <- dirname(this.file)
kuna.matata
źródło
2

Właśnie to wypracowałem. Aby zapewnić przenośność skryptu, zawsze zaczynaj od:

wd <- setwd(".")
setwd(wd)

Działa, ponieważ „.” tłumaczy jak polecenie Unix $ PWD. Przypisanie tego ciągu do obiektu znakowego pozwala następnie wstawić ten obiekt znakowy do setwd () i Presto twój kod zawsze będzie działał z bieżącym katalogiem jako katalogiem roboczym, bez względu na to, na której maszynie się znajduje lub gdzie w strukturze pliku jest usytuowany. (Dodatkowa premia: Obiekt wd może być używany z file.path () (tzn. File.path (wd, „katalog_wyjściowy”), aby umożliwić utworzenie standardowego katalogu wyjściowego niezależnie od ścieżki pliku prowadzącej do nazwanego katalogu. Wymaga to utworzenia nowego katalogu przed odwołaniem się do niego w ten sposób, ale to również może być pomocne w przypadku obiektu wd.

Alternatywnie poniższy kod wykonuje dokładnie to samo:

wd <- getwd()
setwd(wd)

lub jeśli nie potrzebujesz ścieżki pliku w obiekcie, możesz po prostu:

setwd(".")
Andrew Moffat Jr.
źródło
11
Nie. Znajduje katalog procesu, a nie sam plik.
user1071847,
To działało dla mnie w systemie Windows z RStudio w trybie interaktywnym.
Contango,
2

Zauważ, że pakiet getopt udostępnia get_Rscript_filenamefunkcję, która wykorzystuje tylko to samo rozwiązanie przedstawione tutaj, ale jest już dla Ciebie napisana w standardowym module R, więc nie musisz kopiować i wklejać funkcji „pobierz ścieżkę skryptu” do każdego skryptu ty piszesz.

Ryan C. Thompson
źródło
Zawsze zwraca NA, nawet jeśli utworzę skrypt, który drukuje jego dane wyjściowe, a następnie R -e "library(getopt); testscript.R"
wywołuję
1
Jak sugeruje nazwa funkcji, musisz uruchomić skrypt za pomocą Rscript.
Ryan C. Thompson
Ach, ups. Dzięki.
bokov
1

Zobacz findSourceTraceback()na R.utils pakietu, który

Znajduje wszystkie obiekty „srcfile” generowane przez source () we wszystkich ramkach wywołań. Dzięki temu można dowiedzieć się, które pliki są obecnie skryptowane przez source ().

HenrikB
źródło
1

Miałem problemy z powyższymi implementacjami, ponieważ mój skrypt jest obsługiwany z katalogu z dowiązaniami symbolicznymi, a przynajmniej dlatego uważam, że powyższe rozwiązania nie działały dla mnie. Wzdłuż linii odpowiedzi @ ennuikiller, zawinąłem swój skrypt Rscript w bash. Ustawiam zmienną ścieżkową za pomocą pwd -P, która rozwiązuje dowiązania struktur katalogów. Następnie przekaż ścieżkę do Rscript.

Bash.sh

#!/bin/bash

# set path variable
path=`pwd -P`

#Run Rscript with path argument
Rscript foo.R $path

foo.R

args <- commandArgs(trailingOnly=TRUE)
setwd(args[1])
source(other.R)
Luke Singham
źródło
1

Użyłbym wariantu podejścia @ steamer25. Chodzi o to, że wolę uzyskać ostatni skrypt, nawet jeśli moja sesja została uruchomiona za pomocą Rscript. Poniższy fragment kodu, jeśli jest zawarty w pliku, zapewni zmienną thisScriptzawierającą znormalizowaną ścieżkę skryptu. Przyznaję się do (ab) użycia źródła, więc czasami wywołuję Rscript, a skrypt podany w --fileźródłach argumentów ma inny skrypt, który pobiera inny ... Pewnego dnia zainwestuję w przekształcenie mojego niechlujnego kodu w pakiet.

thisScript <- (function() {
  lastScriptSourced <- tail(unlist(lapply(sys.frames(), function(env) env$ofile)), 1)

  if (is.null(lastScriptSourced)) {
    # No script sourced, checking invocation through Rscript
    cmdArgs <- commandArgs(trailingOnly = FALSE)
    needle <- "--file="
    match <- grep(needle, cmdArgs)
    if (length(match) > 0) {
      return(normalizePath(sub(needle, "", cmdArgs[match]), winslash=.Platform$file.sep, mustWork=TRUE))
    }
  } else {
    # 'source'd via R console
    return(normalizePath(lastScriptSourced, winslash=.Platform$file.sep, mustWork=TRUE))
  }
})()
Ailton Andrade de Oliveira
źródło
1

99% przypadków, których możesz po prostu użyć:

sys.calls()[[1]] [[2]]

Nie zadziała w przypadku szalonych wywołań, w których skrypt nie jest pierwszym argumentem, tj source(some args, file="myscript"). Użyj @ hadley w tych fantazyjnych przypadkach.

Antonio
źródło
Jednak nie z poziomu RStudio, z wyjątkiem pozyskiwania
nJGL
1

Podejście Steamer25 działa, ale tylko wtedy, gdy na ścieżce nie ma białych znaków. Na MacOS przynajmniej cmdArgs[match]powraca coś /base/some~+~dir~+~with~+~whitespace/dla /base/some\ dir\ with\ whitespace/.

Obejrzałem to, zastępując „~ + ~” prostą białą spacją przed jej zwróceniem.

thisFile <- function() {
  cmdArgs <- commandArgs(trailingOnly = FALSE)
  needle <- "--file="
  match <- grep(needle, cmdArgs)
  if (length(match) > 0) {
    # Rscript
    path <- cmdArgs[match]
    path <- gsub("\\~\\+\\~", " ", path)
    return(normalizePath(sub(needle, "", path)))
  } else {
    # 'source'd via R console
    return(normalizePath(sys.frames()[[1]]$ofile))
  }
}

Oczywiście nadal możesz rozszerzyć blok else, tak jak zrobił to aprstar.

ja piłka
źródło
1

Jeśli zamiast skryptu, foo.Rznając jego lokalizację ścieżki, możesz zmienić kod tak, aby zawsze odwoływał się do wszystkich sourceścieżek ze wspólnego, rootto mogą być bardzo pomocne:

Dany

  • /app/deeply/nested/foo.R
  • /app/other.R

To zadziała

#!/usr/bin/env Rscript
library(here)
source(here("other.R"))

Zobacz https://rprojroot.r-lib.org/, aby dowiedzieć się, jak zdefiniować katalog główny projektu.

mmell
źródło
Dla mnie pakiet tutaj wykonuje dokładnie tę pracę i wydaje się łatwym rozwiązaniem
Ron
0
#!/usr/bin/env Rscript
print("Hello")

# sad workaround but works :(
programDir <- dirname(sys.frame(1)$ofile)
source(paste(programDir,"other.R",sep='/'))
source(paste(programDir,"other-than-other.R",sep='/'))
kinjelom
źródło
Nadal pojawia się błąd „Błąd w sys.frame (1): nie tak wiele klatek na stosie”
Michael Barton,
0

Zadziwiające, że w R nie ma struktury typu „0 $”! Możesz to zrobić za pomocą wywołania system () skryptu bash napisanego w języku R:

write.table(c("readlink -e $0"), file="scriptpath.sh",col=F, row=F, quote=F)
thisscript <- system("sh scriptpath.sh", intern = TRUE)

Następnie po prostu podziel nazwę scriptpath.sh dla other.R

splitstr <- rev(strsplit(thisscript, "\\/")[[1]])
otherscript <- paste0(paste(rev(splitstr[2:length(splitstr)]),collapse="/"),"/other.R")
bruce.moran
źródło
Otrzymuję komunikat o błędziereadLink: illegal option -- e usage: readLink [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
altabq
0

Patrząc na stos wywołań, możemy uzyskać ścieżkę pliku każdego wykonywanego skryptu, dwa najbardziej przydatne będą prawdopodobnie albo aktualnie wykonywanym skryptem, albo pierwszym skryptem, który zostanie pozyskany (pozycja).

script.dir.executing = (function() return( if(length(sys.parents())==1) getwd() else dirname( Filter(is.character,lapply(rev(sys.frames()),function(x) x$ofile))[[1]] ) ))()

script.dir.entry = (function() return( if(length(sys.parents())==1) getwd() else dirname(sys.frame(1)$ofile) ))()
użytkownik425678
źródło