У меня есть скрипт foo.R
другой other.R
, который находится в том же каталоге:
#!/usr/bin/env Rscript
message("Hello")
source("other.R")
Но я хочу R
найти, что other.R
независимо от текущего рабочего каталога.
Другими словами, foo.R
нужно знать свой путь. Как я могу это сделать?
Ответы:
Здесь есть простое решение проблемы. Эта команда:
возвращает путь к текущему файлу скрипта. Работает после сохранения скрипта.
источник
dirname(sys.frame(1)$ofile)
напрямую из Rstudio. Он работает нормально, когда скрипт выполняется с использованием источника ("other.R"), иdirname(sys.frame(1)$ofile)
находится внутри"other.R"
.NULL
когда это помещено в server.R при использовании блестящегоВы можете использовать
commandArgs
функцию, чтобы получить все опции, которые были переданы Rscript фактическому интерпретатору R, и найти их--file=
. Если ваш скрипт был запущен с пути или если он был запущен с полным путем, тоscript.name
нижеприведенное будет начинаться с'/'
. В противном случае оно должно быть относительноcwd
и вы можете объединить два пути, чтобы получить полный путь.Редактировать: звучит так, как будто вам нужно только
script.name
вышеперечисленное и удалить последний компонент пути. Я удалил ненужныйcwd()
образец, очистил основной скрипт и разместил свойother.R
. Просто сохраните этот скрипт иother.R
скрипт в той же директории, в которойchmod +x
они находятся, и запустите основной скрипт.main.R :
другое.Р :
вывод :
Это то, что я считаю, что Дехманн ищет.
источник
source
как я думал, хотел ОП - но, возможно, я неправильно понял его / ее требование. Но я не могу un-downmod :( Извините!other.name <- file.path(script.basename, "other.R")
commandArgs(trailingOnly = FALSE)
внутри server.R в блестящем приложении, я получаю[1] "RStudio" "--interactive"
. Нет информации о каталоге, из которого он был вызван.Я не мог заставить решение Suppressingfire работать при «исходном» режиме с консоли R.
Я не мог заставить решение Хадли работать при использовании Rscript.
Лучшее из обоих миров?
источник
Rscript
иsource()
внутри R. Я бы предложил сделатьnormalizePath()
на обеих версиях, так что он дает полный путь в обоих случаях.library(base)
мне потребовалось некоторое время, чтобы понять это.source(file.path(dirname(thisFile()), "other.R"))
вfoo.R
. Это работает для меня.main.R
какой источник,helper.R
который вызываетthisFile()
. Он выберет путьmain.R
вместоhelper.R
. Любые советы здесь?Не спрашивайте меня, как это работает, потому что я забыл: /
источник
sys.frames
возвращает окружение стека вызовов, поэтому оно действительно имеет смысл только при вызове из функции. Попробуйте, напримерfoo <- function() {bar <- function() print(sys.frames()); bar()}; foo()
. Я не могу понять код @ hadley, хотя, потому что окружение не имеетofile
члена.source("~/code/test.r")
,PATH
будет установлено значение~/desktop
. Если вы просто оцените его на верхнем уровне, он вернет NULL.x$ofile
не определено, поэтомуframe_files
пусто.Это работает для меня
источник
Error: RStudio not running
.""
в моем случаеОтвет rakensi из Getting path of R script является наиболее правильным и действительно блестящим ИМХО. Тем не менее, это все еще хак, включающий фиктивную функцию. Я цитирую это здесь, чтобы другим было легче найти его.
Это дает каталог файла, в который был помещен оператор (где определена фиктивная функция). Затем его можно использовать для установки рабочего каталога и использования относительных путей, например
или создать абсолютные пути
источник
sourceDir
было пустымcharacter(0)
. Предложения?Мои все в одном! (- 01/01/2019 обновлено для работы с консолью RStudio)
источник
Уменьшенный вариант ответа Supressingfire:
источник
Это работает для меня. Просто извлекает его из аргументов командной строки, удаляет нежелательный текст, делает имя и, наконец, получает полный путь от этого:
источник
Я обернул и расширил ответы на этот вопрос в новую функцию
thisfile()
в rprojroot . Также работает для вязания сknitr
.источник
Мне понравилось решение steamer25, так как оно кажется самым надежным для моих целей. Однако при отладке в RStudio (в windows) путь не будет установлен правильно. Причина в том, что если в RStudio установлена точка останова, то при поиске файла используется альтернативная команда «источник отладки», которая задает путь к сценарию немного по-другому. Вот последняя версия, которую я сейчас использую, которая объясняет это альтернативное поведение в RStudio при отладке:
источник
Я попробовал почти все из этого вопроса: « Получить путь к R-сценарию» , « Получить путь к текущему сценарию» , « Найти местоположение текущего .R-файла» и « Команда R» для установки рабочего каталога на местоположение исходного файла в Rstudio , но в конце я оказался вручную просматривая таблицу CRAN и находя
scriptName
библиотекакоторая предоставляет
current_filename()
функцию, которая возвращает правильный полный путь скрипта при поиске в RStudio, а также при вызове через исполняемый файл R или RScript.источник
Package ‘scriptName’ was removed from the CRAN repository.
- что теперь? : oУ меня тоже была эта проблема, и ни одно из вышеперечисленных решений не помогло мне. Может быть с
source
или тому подобное, но это было недостаточно ясно.Я нашел это, для меня элегантное, решение:
Важно то, что
fileSnapshot()
это дает вам много информации о файле. Возвращает список из 8 элементов. Когда вы выбираетеpath
в качестве элемента списка, путь возвращается с\\
разделителем, так что остальная часть кода просто изменить это.Надеюсь, это поможет.
источник
Вы можете обернуть скрипт r в скрипт bash и получить путь к скрипту как переменную bash следующим образом:
источник
Мне нравится этот подход:
источник
Я просто решил это сам. Чтобы обеспечить переносимость вашего скрипта, всегда начинайте его с:
Это работает, потому что "." переводится как команда Unix $ PWD. Присвоение этой строки символьному объекту позволяет затем вставить этот символьный объект в setwd () и Presto ваш код всегда будет работать с его текущим каталогом в качестве рабочего каталога, независимо от того, на каком компьютере он находится или где в файловой структуре он находится. расположен. (Дополнительный бонус: объект wd можно использовать с file.path () (т. Е. File.path (wd, "output_directory") для создания стандартного выходного каталога независимо от пути к файлу, ведущему к указанному вами каталогу. Это требует от вас создания нового каталога, прежде чем ссылаться на него таким образом, но этому тоже можно помочь с объектом wd.
Альтернативно, следующий код выполняет ту же функцию:
или, если вам не нужен путь к файлу в объекте, вы можете просто:
источник
Обратите внимание, что пакет getopt предоставляет
get_Rscript_filename
функцию, которая использует только то же решение, которое представлено здесь, но уже написана для вас в стандартном модуле R, поэтому вам не нужно копировать и вставлять функцию «get script path» в каждый скрипт ты пишешь.источник
R -e "library(getopt); testscript.R"
Rscript
.См
findSourceTraceback()
от R.utils пакета, которыйисточник
У меня были проблемы с реализациями, описанными выше, так как мой скрипт работает из каталога с символическими ссылками, или, по крайней мере, поэтому я думаю, что вышеупомянутые решения не сработали для меня. Следуя ответу @ ennuikiller, я завернул свой Rscript в bash. Я установил переменную path с помощью
pwd -P
, которая разрешает структуры каталогов с символическими ссылками. Затем пройдите путь в Rscript.Bash.sh
foo.R
источник
Я бы использовал вариант подхода @ steamer25. Дело в том, что я предпочитаю получать последний исходный скрипт, даже когда моя сессия была запущена через Rscript. Следующий фрагмент, если он включен в файл, предоставит переменную,
thisScript
содержащую нормализованный путь сценария. Я признаю (ab) использование source'ing, поэтому иногда я вызываю Rscript, и скрипт, предоставленный в--file
аргументе, приводит к созданию другого скрипта, который является источником другого ... Когда-нибудь я вложу средства в превращение моего грязного кода в пакет.источник
В 99% случаев вы можете просто использовать:
Это не будет работать для сумасшедших вызовов, где сценарий не является первым аргументом, т
source(some args, file="myscript")
. Е. Используйте @ hadley's в этих необычных случаях.источник
Подход Steamer25 работает, но только если на пути нет пробелов. На macOS по крайней мере
cmdArgs[match]
возвращает что-то вроде/base/some~+~dir~+~with~+~whitespace/
для/base/some\ dir\ with\ whitespace/
.Я обошел это, заменив «~ + ~» простым пробелом перед его возвратом.
Очевидно, вы можете расширить блок else, как это сделал aprstar.
источник
Если вместо сценария,
foo.R
зная его местоположение, если вы можете изменить свой код так, чтобы он всегда ссылался на всеsource
пути d из общего,root
тогда это может быть очень полезно:Дано
/app/deeply/nested/foo.R
/app/other.R
Это будет работать
См. Https://rprojroot.r-lib.org/, чтобы узнать, как определить корни проекта.
источник
источник
Удивительно, что в R нет структуры типа '$ 0'! Вы можете сделать это с помощью вызова system () скрипта bash, написанного на R:
Затем просто выделите имя scriptpath.sh для other.R
источник
readLink: illegal option -- e usage: readLink [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
Посмотрев на стек вызовов, мы можем получить путь к файлу для каждого выполняемого сценария. Вероятно, два наиболее полезных будут либо выполняемым в данный момент сценарием, либо первым источником сценария (вход).
источник