Возврат директории с файлом - PullRequest
3 голосов
/ 03 февраля 2012

Есть ли в R команда, которая возвращает полный путь к файлу, содержащему исполняемый код, аналогично PHP $_SERVER['SCRIPT_FILENAME']?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

Я могу подумать о трех ответах, ни один из которых, вероятно, не вполне удовлетворителен для вас, поскольку модель выполнения 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"]
2 голосов
/ 03 февраля 2012

Самый простой способ - вызвать 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:/ 
1 голос
/ 04 февраля 2012

Хотя это немного хрупко, поскольку зависит от внутренних элементов команды source (которая может измениться в будущих версиях R), эта строка в вашем исходном файле должна это делать. Он должен находиться непосредственно на верхнем уровне в вашем исходном файле, а не в функции внутри вашего исходного файла.

this.dir <- dirname(sys.frame(1)$ofile)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...