2012-02-03 2 views
3

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

+0

Как вы выполняете код? –

+0

Возможно, 'getwd()' - это то, что вы ищете? Но ответ на Джошуа помог бы! – Justin

+0

@JoshuaUlrich - Я использую [RStudio] (http://rstudio.org/). – eykanal

ответ

2

Я могу думать о трех ответах, ни один из них, вероятно, полностью вам не подходит, поскольку модель исполнения 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

Самый простой способ - вызвать 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:/  
+0

Итак, это случайное сгенерированное местоположение последней функции, которая была скомпилирована байтом? –

+0

Не для меня (R 2.14.0), даже если я вызываю 'compiler :: enableJIT (4)'. Получаете ли вы странный результат? – Tommy

+0

Я получил: «Вот я:/var/folders/xS/xSUsVXTIHEiP7OLJg2OXmU +++ TI/-Tmp - // RtmpqeJtDX/file1f9196a0". И поскольку это не вызывало никакого вызова whereAmI, я предположил, что это место последней определенной функции. –

1

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

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