Я бы использовал вариант подхода @ steamer25. Дело в том, что я предпочитаю получать последний исходный скрипт, даже когда моя сессия была запущена через Rscript. Следующий фрагмент, если он включен в файл, предоставит переменную thisScript
, содержащую нормализованный путь сценария.
Я признаю (ab) использование source'ing, поэтому иногда я вызываю Rscript и скрипт, предоставленный в аргументе --file
, создает другой скрипт, который порождает другой ... Когда-нибудь я вложу средства в превращение моего грязного кода в пакет .
thisScript <- (function() {
lastScriptSourced <- tail(unlist(lapply(sys.frames(), function(env) env$ofile)), 1)
if (is.null(lastScriptSourced)) {
# No script sourced, checking invocation through Rscript
cmdArgs <- commandArgs(trailingOnly = FALSE)
needle <- "--file="
match <- grep(needle, cmdArgs)
if (length(match) > 0) {
return(normalizePath(sub(needle, "", cmdArgs[match]), winslash=.Platform$file.sep, mustWork=TRUE))
}
} else {
# 'source'd via R console
return(normalizePath(lastScriptSourced, winslash=.Platform$file.sep, mustWork=TRUE))
}
})()