Я бы сказал, что да, вам требуется дерево разбора (и источник) - как еще вы знаете, что составляет "строку" и допустимое утверждение?
Практическое упрощение, хотя может быть«оператор профилирования» вместо «профилировщик строк».В R дерево синтаксического анализа легко доступно: body(theFunction)
, поэтому должно быть достаточно легко вставить измерительный код вокруг каждого оператора.Еще немного поработав, вы можете вставить его вокруг группы операторов, принадлежащих одной строке.
В R тело функции, загружаемой из файла, обычно также имеет атрибут srcref
, в котором указан источникдля каждой «строки» (фактически каждого оператора):
Вот пример функции (вставлен в «example.R»):
f <- function(x, y=3)
{
a <- 0; a <- 1 # Two statements on one line
a <- (x + 1) * # One statement on two lines
(y + 2)
a <- "foo
bar" # One string on two lines
}
Затем в R:
source("example.R")
dput(attr(body(theFunction), "srcref"))
Который печатает эту информацию строки / столбца:
list(structure(c(2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L), srcfile = <environment>, class = "srcref"),
structure(c(3L, 2L, 3L, 7L, 9L, 14L, 3L, 3L), srcfile = <environment>, class = "srcref"),
structure(c(3L, 10L, 3L, 15L, 17L, 22L, 3L, 3L), srcfile = <environment>, class = "srcref"),
structure(c(4L, 2L, 5L, 15L, 9L, 15L, 4L, 5L), srcfile = <environment>, class = "srcref"),
structure(c(7L, 2L, 8L, 6L, 9L, 20L, 7L, 8L), srcfile = <environment>, class = "srcref"))
Как вы можете «видеть» (последние два числа в каждой структуре - начало / конец строки), выражения a <- 0
и a <- 1
сопоставить с той же линией ...
Удачи!