Saya memiliki skrip bernama foo.R
yang menyertakan skrip lain other.R
, yang ada di direktori yang sama:
#!/usr/bin/env Rscript
message("Hello")
source("other.R")
Tetapi saya ingin R
menemukan bahwa other.R
apa pun direktori kerja saat ini.
Dengan kata lain, foo.R
perlu tahu jalannya sendiri. Bagaimana saya bisa melakukan itu?
Jawaban:
Di sini ada solusi sederhana untuk masalah tersebut. Perintah ini:
mengembalikan jalur file skrip saat ini. Ini berfungsi setelah skrip disimpan.
sumber
dirname(sys.frame(1)$ofile)
langsung dari Rstudio. Ini berfungsi ok ketika skrip dieksekusi menggunakan sumber ("other.R"), dandirname(sys.frame(1)$ofile)
ada di dalam"other.R"
.NULL
ketika ini ditempatkan di server.R saat menggunakan mengkilapAnda dapat menggunakan
commandArgs
fungsi ini untuk mendapatkan semua opsi yang diteruskan oleh Rscript ke penerjemah R aktual dan mencarinya--file=
. Jika skrip Anda diluncurkan dari jalur atau jika diluncurkan dengan jalur lengkap, discript.name
bawah ini akan dimulai dengan a'/'
. Kalau tidak, itu harus relatif terhadapcwd
dan Anda dapat menggabungkan kedua jalur untuk mendapatkan path lengkap.Sunting: sepertinya Anda hanya membutuhkan yang di
script.name
atas dan melepaskan komponen akhir dari path. Saya telah menghapuscwd()
sampel yang tidak dibutuhkan dan membersihkan skrip utama dan mempostingother.R
. Simpan saja skrip danother.R
skrip ini ke direktori yang samachmod +x
, dan jalankan skrip utama.main.R :
lainnya.R :
keluaran :
Inilah yang saya percaya yang dicari oleh dehmann.
sumber
source
seperti yang saya pikir OP inginkan - tapi mungkin saya salah membaca persyaratannya. Tapi aku tidak bisa un-downmod :( Maaf!other.name <- file.path(script.basename, "other.R")
commandArgs(trailingOnly = FALSE)
di dalam server. R dalam aplikasi yang mengkilap, saya dapatkan[1] "RStudio" "--interactive"
. Tidak ada informasi tentang direktori dari mana ia dipanggil.Saya tidak bisa mendapatkan solusi Suppressingfire untuk bekerja ketika 'sumber' dari konsol R.
Saya tidak bisa mendapatkan solusi hadley untuk bekerja ketika menggunakan Rscript.
Terbaik dari kedua dunia?
sumber
Rscript
dansource()
dalam R. Saya sarankan melakukannormalizePath()
pada kedua versi, sehingga memberikan jalan penuh dalam kedua kasus.library(base)
saya perlu waktu beberapa saat untuk mencari tahu lolsource(file.path(dirname(thisFile()), "other.R"))
difoo.R
. Ini bekerja untuk saya.main.R
yang sumberhelper.R
panggilanthisFile()
. Ini akan mengambil jalurmain.R
alih-alihhelper.R
. Ada tips di sini?Jangan tanya saya bagaimana cara kerjanya, karena saya sudah lupa: /
sumber
sys.frames
mengembalikan lingkungan tumpukan panggilan, jadi itu benar-benar masuk akal ketika dipanggil dari suatu fungsi. Coba, misalnyafoo <- function() {bar <- function() print(sys.frames()); bar()}; foo()
,. Saya tidak dapat menemukan kode @ hadley karena lingkungan tidak memilikiofile
anggota.source("~/code/test.r")
,PATH
akan diatur ke~/desktop
. Jika Anda hanya mengevaluasinya di tingkat atas, itu akan mengembalikan NULL.x$ofile
tidak terdefinisi, jadiframe_files
kosong.Ini bekerja untuk saya
sumber
Error: RStudio not running
.""
dalam kasus sayaJawaban rakensi dari Getting path of R script adalah IMHO yang paling benar dan benar-benar brilian. Namun, ini masih merupakan hack yang menggabungkan fungsi dummy. Saya mengutipnya di sini, agar lebih mudah ditemukan oleh orang lain.
Ini memberikan direktori file di mana pernyataan itu ditempatkan (di mana fungsi dummy didefinisikan). Kemudian dapat digunakan untuk mengatur direktori kerja dan menggunakan jalur relatif misalnya
atau untuk membuat jalur absolut
sumber
sourceDir
kosong.character(0)
. Saran?Semua dalam satu! (--01 / 09/2019 diperbarui untuk berurusan dengan RStudio Konsol)
sumber
Varian ramping dari jawaban Supressingfire:
sumber
Ini bekerja untuk saya. Hanya mengeluarkannya dari argumen baris perintah, menghapus teks yang tidak diinginkan, melakukan dirname dan akhirnya mendapatkan path lengkap dari itu:
sumber
Saya telah membungkus dan memperluas jawaban untuk pertanyaan ini menjadi fungsi baru
thisfile()
di rprojroot . Juga berfungsi untuk merajutknitr
.sumber
Saya menyukai solusi steamer25 karena tampaknya yang paling kuat untuk tujuan saya. Namun, ketika debugging di RStudio (di windows), jalan tidak akan ditetapkan dengan benar. Alasannya adalah bahwa jika breakpoint diatur dalam RStudio, sumber file menggunakan perintah "sumber debug" alternatif yang menetapkan jalur skrip sedikit berbeda. Ini adalah versi final yang saat ini saya gunakan untuk akun mana perilaku alternatif ini dalam RStudio saat debugging:
sumber
Saya mencoba hampir semua hal dari pertanyaan ini, Mendapatkan jalur skrip R , Dapatkan jalur skrip saat ini , Temukan lokasi file .R saat ini dan perintah R untuk mengatur direktori kerja ke lokasi file sumber di Rstudio , tetapi pada akhirnya menemukan diri saya secara manual menelusuri tabel CRAN dan menemukan
scriptName
Perpustakaanyang menyediakan
current_filename()
fungsi, yang mengembalikan jalur skrip lengkap yang tepat saat sumber di RStudio dan juga ketika menjalankan melalui R atau RScript yang dapat dieksekusi.sumber
Package ‘scriptName’ was removed from the CRAN repository.
- apa sekarang? : oSaya juga memiliki masalah ini, dan tidak ada solusi di atas yang berfungsi untuk saya. Mungkin dengan
source
atau hal-hal seperti itu, tetapi itu tidak cukup jelas.Saya menemukan ini, bagi saya anggun, solusi:
Yang penting dalam hal itu adalah
fileSnapshot()
memberi Anda banyak informasi tentang file. Ia mengembalikan daftar 8 elemen. Ketika Anda memilihpath
sebagai elemen daftar, jalan dikembalikan dengan\\
sebagai pemisah, sehingga sisa kode hanya untuk mengubahnya.Saya harap ini membantu.
sumber
Anda dapat membungkus skrip r dalam skrip bash dan mengambil jalur skrip sebagai variabel bash seperti:
sumber
Saya suka pendekatan ini:
sumber
Saya baru saja menyelesaikan ini sendiri. Untuk memastikan portabilitas skrip Anda selalu mulai dengan:
Ini bekerja karena "." diterjemahkan seperti perintah Unix $ PWD. Menetapkan string ini ke objek karakter memungkinkan Anda untuk kemudian memasukkan objek karakter tersebut ke setwd () dan Presto kode Anda akan selalu berjalan dengan direktori saat ini sebagai direktori kerja, tidak peduli di mana mesin itu berada atau di mana dalam struktur file itu. terletak. (Bonus tambahan: Objek wd dapat digunakan dengan file.path () (mis. File.path (wd, "output_directory") untuk memungkinkan pembuatan direktori output standar terlepas dari jalur file yang mengarah ke direktori yang Anda beri nama. Ini memang mengharuskan Anda untuk membuat direktori baru sebelum merujuknya dengan cara ini tetapi itu juga dapat dibantu dengan objek wd.
Bergantian, kode berikut melakukan hal yang sama persis:
atau, jika Anda tidak memerlukan path file dalam suatu objek, Anda cukup:
sumber
Perhatikan bahwa paket getopt menyediakan
get_Rscript_filename
fungsi, yang hanya menggunakan solusi yang sama dengan yang disajikan di sini, tetapi sudah ditulis untuk Anda dalam modul R standar, jadi Anda tidak perlu menyalin dan menempelkan fungsi "get path path" ke setiap skrip Anda menulis.sumber
R -e "library(getopt); testscript.R"
Rscript
.Lihat
findSourceTraceback()
dari R.utils paket, yangsumber
Saya memiliki masalah dengan implementasi di atas karena skrip saya dioperasikan dari direktori yang disinkronkan, atau setidaknya itu sebabnya saya pikir solusi di atas tidak bekerja untuk saya. Sejalan dengan jawaban @ ennuikiller, saya membungkus Rscript saya dengan bash. Saya mengatur variabel path menggunakan
pwd -P
, yang menyelesaikan struktur direktori yang disinkronkan. Kemudian masukkan path ke dalam Rscript.Bash.sh
untukR
sumber
Saya akan menggunakan varian dari pendekatan @ steamer25. Intinya adalah bahwa saya lebih suka mendapatkan skrip bersumber terakhir bahkan ketika sesi saya dimulai melalui Rscript. Cuplikan berikut, ketika disertakan pada file, akan memberikan variabel yang
thisScript
berisi jalur normalisasi skrip. Saya mengakui (ab) penggunaan sumber, jadi kadang-kadang saya meminta Rscript dan skrip yang disediakan dalam--file
argumen sumber skrip lain yang sumber lain ... Suatu hari saya akan berinvestasi dalam membuat kode berantakan saya berubah menjadi sebuah paket.sumber
99% dari kasus yang mungkin Anda gunakan:
Ini tidak akan berfungsi untuk panggilan gila di mana skrip bukan argumen pertama, yaitu
source(some args, file="myscript")
,. Gunakan @ hadley dalam kasus mewah ini.sumber
Pendekatan Steamer25 bekerja, tetapi hanya jika tidak ada spasi putih di jalur. Pada macOS setidaknya
cmdArgs[match]
mengembalikan sesuatu seperti/base/some~+~dir~+~with~+~whitespace/
untuk/base/some\ dir\ with\ whitespace/
.Saya mengatasi ini dengan mengganti "~ + ~" dengan spasi putih sebelum mengembalikannya.
Jelas Anda masih dapat memperpanjang blok lain seperti yang dilakukan aprstar.
sumber
Jika daripada skrip,
foo.R
mengetahui lokasi jalurnya, jika Anda dapat mengubah kode untuk selalu merujuk semuasource
jalur dari yang umum,root
maka ini mungkin sangat membantu:Diberikan
/app/deeply/nested/foo.R
/app/other.R
Ini akan bekerja
Lihat https://rprojroot.r-lib.org/ untuk cara mendefinisikan akar proyek.
sumber
sumber
Luar biasa tidak ada struktur tipe '$ 0' di R! Anda dapat melakukannya dengan system () panggilan ke skrip bash yang ditulis dalam R:
Kemudian cukup bagikan nama scriptpath.sh untuk other.R
sumber
readLink: illegal option -- e usage: readLink [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
Dengan melihat tumpukan panggilan kita bisa mendapatkan filepath dari setiap skrip yang dieksekusi, dua yang paling berguna mungkin akan menjadi skrip yang sedang dieksekusi, atau skrip pertama yang bersumber (entri).
sumber