Я работаю в стеке вызовов переменной глубины, которая выглядит какНайти родительскую среду в стеке вызовов по имени функции
TopLevelFunction
-> <SomeOtherFunction(s), 1 or more>
-> AssignmentFunction
Теперь моя цель состоит в том, чтобы присвоить переменной, созданной в AssignmentFunction
, к окружающей среде TopLevelFunction
. Я знаю, что могу извлечь из стека с sys.calls
, так что мой нынешний подход
# get the call stack and search for TopLevelFunction
depth <- which(stringr::str_detect(as.character(sys.calls()), "TopLevelFunction"))
# assign in TopLevelFunction's environment
assign(varName, varValue, envir = sys.frame(depth))
Я более или менее хорошо с этим, хотя я не уверен, что это хорошая идея, чтобы преобразовать объекты вызовов к векторам символов. Является ли этот подход склонным к ошибкам? В более общем плане, как бы вы искали определенную родительскую среду, зная только имя функции?
Хорошая идея, но это не сработает, если я буду устанавливать больше функций между 'AssignmentFunction' и' TopLevelFunction'. В моей ситуации стек вызовов может быть, скажем, 3 или 5 функциями в глубину, поэтому я вынужден извлечь весь стек. Что касается глобального присвоения, то он обычно нахмурился, так как влияет на глобальное состояние, поэтому я сделал все возможное, чтобы избежать этого. – tonytonov
Ahh, я вижу, так что, если вы рекурсивно получите родительскую среду, пока не достигнете непосредственно перед глобальной средой? .., ... здесь код выглядит ужасно, поэтому я отправлю еще один ответ ... – elikesprogramming