2015-01-15 2 views
4

Я ищу способ программного анализа (и манипулирования) дерева вызовов вызовов функций, которые у меня есть в R-скриптах. Я узнал, что в пакете pryr есть функция pryr :: ast(), которая возвращает иерархическую древовидную структуру вызова. Я хочу что-то подобное, но, как я уже говорил, что нужно работать на строки ввода:Анализ дерева вызовов для вызова функций R в скриптах

В качестве примера рассмотрим содержание следующего примера файла input.R, который находится на моем жестком диске:

mean(sqrt(1:10 - 1), na.rm = T, trim = 0.1) 

Задача состоит в том, чтобы прочитать input.R в R, а затем, по существу, пройти скрипт и собрать вызовы вложенных функций в какой-либо форме списка, например pryr печатает это:

\-() 
\- `mean 
\-() 
    \- `sqrt 
    \-() 
    \- `- 
    \-() 
     \- `: 
     \- 1 
     \- 10 
    \- 1 
    \- `T 
    \- 0.1 

Есть некоторый элегантный способ сделать это, или я должен Ues некоторой формы регулярных выражений для идентификации вызовов?

+0

Что вы ищете, это дерево разбора *, а не дерево вызовов. Дерево вызовов - это нечто другое (хотя и связанное). Кроме того, поскольку вы, очевидно, знаете о pryr, в чем именно вопрос? –

+0

спасибо за исправление. – user3393472

+0

На самом деле, я должен признать, что даже в учебном пособии Хэдли «Advanced R» это неправильно, и используется термин «дерево вызовов». И даже мой комментарий был несколько неправильным: общим термином является «синтаксическое дерево», из которых «дерево разбора» в значительной степени является синонимом, но это использование кажется странным вне контекста анализатора (чтобы проиллюстрировать это, результат «вызов» ('+', quote (a), 1) '- это синтаксическое дерево *, но поскольку оно не было * проанализировано *, скорее, оно было построено из вызовов функций - термин« дерево синтаксического анализа »был бы странным здесь). –

ответ

2

Попробуйте следующее:

  • использование parse(text = ...) для преобразования строки в выражение
  • использования call_tree() из пакета pryr построить дерево вызовов
  • использовать capture.output, чтобы захватить результаты от stdout в лист

Например:

library(pryr) 
f <- "mean(sqrt(1:10 - 1), na.rm = T, trim = 0.1)" 
x <- capture.output(call_tree(parse(text=f))) 

Ваш результат является символьным вектором (т. a)

x 
[1] "\\-()"   " \\- `mean"  " \\-()"  " \\- `sqrt" " \\-()"  
[6] "  \\- `-" "  \\-()" "  \\- `:" "  \\- 1" "  \\- 10" 
[11] "  \\- 1" " \\- `T"  " \\- 0.1 "  

str(x) 
chr [1:13] "\\-()" " \\- `mean" " \\-()" " \\- `sqrt" " \\-()" ... 

cat(x, sep="\n") 
\-() 
    \- `mean 
    \-() 
    \- `sqrt 
    \-() 
     \- `- 
     \-() 
     \- `: 
     \- 1 
     \- 10 
     \- 1 
    \- `T 
    \- 0.1 
+0

Я думаю, что OP это уже знает. –

+0

@ KonradRudolph Может быть, но это не было очевидно для меня из вопроса. Для меня, конечно же, не было очевидным, как получить этот результат с использованием 'string' в качестве входных данных. Примеры в 'ast()' только демонстрируют, как это сделать с выражениями, а не строками. – Andrie

+0

pryr существует главным образом (исключительно?) В качестве дополнения к [учебнику о R] (http://adv-r.had.co.nz/). И там, разбор объясняется непосредственно перед операциями на АСТ. –

Смежные вопросы