Как найти *все* переменные с лексическими ссылками, скрытые внутри функций?

Я пытаюсь извлечь все символы внутри тела функции, которые не были определены в этой функции, но были определены где-то в стеке среды. Первоначально я думал, что могу сделать это, используя возвращаемое значение codetools::findGlobals, но, видимо, эта функция не делает именно то, что я думал, поскольку она пропускает переменные, на которые ссылаются внутри выражения в кавычках. Смотрите воспроизводимый пример ниже:

x = 2
y = 1
hidden = function() {
  eval(quote({ x + y }))
}
revealed = function() {
  x + y
}
codetools::findGlobals(hidden)
codetools::findGlobals(revealed)

Учитывая это ограничение findGlobals, есть ли предпочтительный альтернативный метод?


person wdkrnls    schedule 21.08.2019    source источник
comment
Это действительно невозможно в общем случае без фактического выполнения кода. Я имею в виду, что если бы вы сделали что-то вроде eval(as.name(paste0("a","b"))), это все равно было бы трудно обнаружить, потому что вы динамически создаете код. Но в этом случае функция find_vars() из другого вопроса сделает то, что вы хотите, и извлечет все эти символы.   -  person MrFlick    schedule 21.08.2019