Если это ваш собственный сценарий, и вы можете контролировать его форматирование, достаточно простого соглашения. Просто убедитесь, что каждое имя функции начинается с первого символа в строке и что слово function
также появляется в этой строке. Любое другое использование слова function
должно появляться в строке, которая начинается с пробела или табуляции. Тогда однострочное решение:
sub(" .*", "", grep("^\\S.*function", readLines("myscript.R"), value = TRUE))
Преимущества этого подхода в том, что
это очень просто . Правила просто изложены, и есть только одна простая строка кода R, необходимая для извлечения имен функций. Regex также прост, и для существующего файла это очень легко проверить - просто наберите слово function
и проверьте, соответствует ли каждое отображаемое вхождение правилу.
нет необходимости запускать источник. Это полностью статично .
во многих случаях вам вообще не нужно менять исходный файл, а в других случаях изменения будут минимальными. Если вы пишете сценарий с нуля с учетом этого, его еще проще организовать.
Есть много других альтернатив вдоль идеи конвенций. у вас может быть более сложное регулярное выражение или вы можете добавить # FUNCTION
в конце первой строки определения любой функции, если вы пишете скрипт с нуля, а затем извлекаете эту фразу и извлекаете первое слово в строке, но основное предложение здесь кажется особенно привлекателен благодаря своей простоте и другим перечисленным преимуществам.
Тестовое задание
# generate test file
cat("f <- function(x) x\nf(23)\n", file = "myscript.R")
sub(" .*", "", grep("^\\S.*function", readLines("myscript.R"), value = TRUE))
## [1] "f"
source()
, но эта старая тема может быть интересна для вас.