В R есть способ узнать путь к исходному файлу, где определена данная функция? - PullRequest
2 голосов
/ 04 марта 2011

Я пишу модульный тест в R, который должен прочитать некоторые тестовые данные, определенные в том же каталоге.Но я также хотел бы иметь возможность запускать этот модульный тест независимо от того, каким является текущий рабочий каталог.

Есть ли способ указать R загрузить файл из здесь ,где здесь определяется как каталог, содержащий исходный файл выполняемой функции?

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

Зависит от того, что вы имеете в виду под «я пишу модульный тест». Если вы просто получаете эту функцию откуда угодно, Дэвид прав, и я даже не вижу необходимости делать это, поскольку вы знаете, какой это каталог.

Я бы включил эту функцию в пакет, а затем в R есть механизмы, позволяющие вам сделать данные доступными для загрузки или с помощью отложенной загрузки. См. Раздел 1.1.5 (Данные в пакетах) в руководстве Запись расширений R . Это R-способ сделать это.

Другой вариант, который Габор Гротендик дал этой теме в списке рассылки R, - добавить следующую строку вверху скрипта:

this.dir <- dirname(parent.frame(2)$ofile)

Это даст каталог файла, когда он получен с использованием source(). Габор называет это грязным хаком, и я с ним согласен.

На sidenote, проверьте также следующие пакеты для модульного тестирования в R:

1 голос
/ 04 марта 2011

Если функции не находятся в пакете и получены из файлов через source(), то, возможно, ссылки на источники могут предоставить что-то для работы.Аргумент keep.source = TRUE обязателен, и прочитайте статью Дункана Мердока R Journal

Вот краткий пример:

> setwd("./Downloads/")
> source("../foo.R", keep.source=TRUE) ## if options("keep.source") is FALSE
> bar
function(a, b) {
    a + b
}
> body(bar)
{
    a + b
}
attr(,"srcfile")
../foo.R 
attr(,"wholeSrcref")
bar <- function(a, b) {
    a + b
}

> srcref <- attr(body(bar), "srcref")[[1]]
> attr(srcref, "srcfile")
../foo.R
> ls(attr(srcref, "srcfile"))
[1] "Enc"       "encoding"  "filename"  "timestamp" "wd"       
> attr(srcref, "srcfile")$filename
[1] "../foo.R"
> attr(srcref, "srcfile")$wd
[1] "/home/gavin/Downloads"

Конечно, это предполагает, что вы неНе знаю, откуда берутся исходные функции, и все же функции должны быть получены ...

Если это в пакете, то вы можете иметь данные в каталоге ./data или в произвольном порядке.каталоги в ./inst/.Вы можете использовать data() наборов данных toload из предыдущего и system.file() для любого файла в пакете.См. Соответствующие страницы справки.

0 голосов
/ 04 марта 2011

Нет реальной надежды достичь этого в полной общности. Функции не нужно загружать из файлов, их можно динамически создавать с помощью кода, загружать из рабочих областей и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...