Как я могу извлечь информацию о назначении дальше в стеке вызовов? - PullRequest
0 голосов
/ 05 мая 2020

для скрытых процессов в более крупном приложении R Shiny я хочу восстановить имя, которое назначает пользователь.

Например, если пользователь привязывает значение 1 к имени x (x <- 1), то я хочу извлечь имя «x» из стека вызовов. После некоторых исследований по оценке функций и средам стека вызовов в R ( здесь , здесь , здесь и? Sys.parent), я смог поставить вместе частичное решение. Он возвращает объект класса вызова, которым можно манипулировать с помощью пакета rlang.

f <- function() sys.call(which = 1)
(assign("x", f()))

Несмотря на это, как оператор присваивания x <- 1 (возвращает f ()), так и его префиксная форма `<-`("x", 1) (возвращает 1) нарушают мое решение. Я нахожу это озадачивающим, потому что все три функции (<-, `<-`() и assign()) имеют похожие абстрактные синтаксические деревья. Во всяком случае, пользователи моего кода должны следовать обычным шаблонам присваивания и вообще ничего не замечать.

Подсказки или указатели на дополнительные ресурсы приветствуются.

Спасибо!

1 Ответ

0 голосов
/ 08 мая 2020

После еще нескольких экспериментов, я думаю, что нашел ответ. Оператор присваивания <- - это примитивная функция. Он поставляется предварительно скомпилированным в формате C. Функция assign(), напротив, не является примитивной. Судя по всему, примитивные функции не проходят через один и тот же стек вызовов. Приведу другой пример:

is.primitive(`+`) # TRUE
add <- function() {
  print(sys.calls())
  1
}
is.primitive(add) # FALSE
(1 + add()) # `+` doesn't show

Результат наводит меня на мысль, что семейство функций sys. *** читает стек вызовов интерпретатора R. Звонки, не нуждающиеся в переводе, не проходят через go. Кто-нибудь может подтвердить?

...