Есть ли команда в R, которая вернет полный путь к файлу, содержащему исполняемый код, аналогичный PHP $_SERVER['SCRIPT_FILENAME']
?Возвращающийся каталог содержащего файла
ответ
Я могу думать о трех ответах, ни один из них, вероятно, полностью вам не подходит, поскольку модель исполнения R отличается от PHP. Это необходимо для: a) местоположения исполняемого файла R, b) местоположения каталога по умолчанию для источников поиска и c) местоположений, где R будет искать установленные пакеты, если не указано однозначное местоположение:
R.home()
#[1] "/Library/Frameworks/R.framework/Resources"
getwd()
#[1] "/Users/davidwinsemius"
.libPaths()
#[1] "/Users/davidwinsemius/Library/R/2.14/library"
#[2] "/Library/Frameworks/R.framework/Versions/2.14/Resources/library"
Я думал о четвертом варианте, который может быть тем, что вы на самом деле хотите. Если вы начали пакетный сеанс R с вызовом CMD, вы можете восстановить аргументы этой команды с первой строкой и (возможно, в зависимости от того, как вы сделали вызов и вашу ОС) определить входной файл с помощью:
cmdargs <- commandArgs(TRUE)
cmdargs["infile"]
Самый простой способ - вызвать source
, чтобы выполнить скрипт с аргументом chdir=TRUE
. Затем сценарию нужно позвонить только getwd()
. Тем не менее, это зависит от вызывающего сценария для правильной работы.
Другой способ - понять, что каждая функция обычно сохраняет исходную информацию (ее можно отключить). Поэтому, если вы определяете функцию в своем скрипте, вы можете извлечь имя файла из экземпляра функции.
Поместите следующее в "C: /foo.R" (или "/tmp/foo.R" на Linux):
whereAmI <- function() attr(attr(whereAmI, 'srcref'), 'srcfile')$filename
fileName <- whereAmI()
cat("Here I am:", fileName, "\n")
cat("In folder:", dirname(fileName), "\n")
... Тогда попробуйте:
> source("c:/foo.R")
Here I am: c:/foo.R
In folder: c:/
Итак, это случайное сгенерированное местоположение последней функции, которая была скомпилирована байтом? –
Не для меня (R 2.14.0), даже если я вызываю 'compiler :: enableJIT (4)'. Получаете ли вы странный результат? – Tommy
Я получил: «Вот я:/var/folders/xS/xSUsVXTIHEiP7OLJg2OXmU +++ TI/-Tmp - // RtmpqeJtDX/file1f9196a0". И поскольку это не вызывало никакого вызова whereAmI, я предположил, что это место последней определенной функции. –
Хотя это немного хрупко, поскольку это зависит от внутренних компонентов команды source
(что может измениться в будущих версиях R) эта строка в вашем исходном файле должна это сделать. Он должен быть непосредственно на верхнем уровне в вашем исходном файле, а не в функции в вашем исходном файле.
this.dir <- dirname(sys.frame(1)$ofile)
Как вы выполняете код? –
Возможно, 'getwd()' - это то, что вы ищете? Но ответ на Джошуа помог бы! – Justin
@JoshuaUlrich - Я использую [RStudio] (http://rstudio.org/). – eykanal