[Этот вопрос был разрешен в чате Spacedman, но я отправляю его для других в будущем.]
У меня есть функция myFunc, которая создает внутри нее localFunc. (NB: это не в пакете, а в глобальной среде.) Я хотел бы знать, где localFunc существует в пути поиска, так как я бы хотел проанализировать его с помощью mvbutils::foodweb.
Вот пример:
myFunc <- function(){
require(data.table)
require(mvbutils)
localFunc <- function(x){
return(as.data.table(x))
}
vecPrune <- c("localFunc",ls("package:data.table"))
ix <- match("data.table",search())
tmpWeb <- foodweb(where = c(1,ix), prune = vecPrune, plotting = FALSE)
return(tmpWeb)
}
Однако вызов myFunc() не указывает, что localFunc вызывает data.table(). Это неверно - что дает?
(NB: аргумент where указывает путь поиска.)
Обновление 1: Как указывает Томми и Spacedman, трюк заключается в том, чтобы указать environment(). Вызов foodweb() относится к where = c(1, ix). Индекс 1 является ошибкой. Это возникло из-за того, что .GlobalEnv, который часто (всегда?) Является первым элементом в векторе search(), является правильным местом для поиска. Это ошибочно. Вместо этого следует обратиться к environment(), и правильный вызов ниже. (NB: ix указывает расположение data.table() на выходе search().)
tmpWeb <- foodweb(where = c(environment(),ix), prune = vecPrune, plotting = FALSE)
Это появляется в ответе этого вопроса в функции с именем checkScriptDependencies, которая переносит код из файла R script в локальную функцию, который затем анализируется на foodweb. Это ограниченный пример использования environment(), и Томми дал хорошее объяснение, как использовать его и аналогичные функции в этом контексте.