Если вы считаете, что данное решение не работает, то, вероятно, вы не просто хотите знать путь при создании файла, но постоянно для любых объектов, которые он создает.
srcref
система предоставляет хотя бы часть того, что вы хотите, если options(keep.source=TRUE)
Например:
> source("~/Downloads/main.R")
> getSrcFilename(svy_vglm,full.names=TRUE)
[1] "svgam.R"
> getSrcFilename(f)
[1] "main.R"
> getSrcDirectory(f)
[1] "/Users/tlum005/Downloads"
Каталог - это каталог, по которому был найден файл: если вы только что сделали source("main.R")
каталог будет .
, а не его абсолютная форма.
Переписав свой main.R
, вы можете получить
f = function() {
cat(getSrcDirectory(f))
}
f()
Здесь есть две слабые стороны: атрибуты srcref копируются по присваиванию, а f()
полагается на знание своего собственного имени. Если вы сделали
g<-f
g()
rm(f)
g()
, вы можете захотеть, чтобы два вызова g()
вернули оба ошибки (так как g()
не было получено) или оба возвращали каталог, но вы не захотите каждого. В этом случае это можно обойти с помощью sys.function()
: если main.R
равно
f = function() {
cat(getSrcDirectory(sys.function()))
}
f()
назначение работает
> source("~/Downloads/main.R")
/Users/tlum005/Downloads
> f()
/Users/tlum005/Downloads
> g<-f
> g()
/Users/tlum005/Downloads
> rm(f)
> g()
/Users/tlum005/Downloads
Я бы не стал пропагандировать с использованием этот метод - я не могу придумать ситуацию, когда вам было бы не лучше просто разместить исходный код где-то лучше организованным - но я думаю, что он действительно отвечает на вопрос.