Якщо це ваш власний сценарій, щоб у вас був контроль над тим, як він відформатований, буде достатньо простої конвенції. Просто переконайтеся, що ім’я кожної функції починається з першого символу на його рядку, і що слово 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()
, але ця стара тема може зацікавити вас.