Se esse for seu próprio script, para que você tenha controle sobre como ele é formatado, uma simples convenção seria suficiente. Apenas verifique se o nome de cada função começa no primeiro caractere de sua linha e se a palavra functiontambém aparece nessa linha. Qualquer outro uso da palavra functiondeve aparecer em uma linha que começa com um espaço ou tabulação. Em seguida, uma solução de uma linha é:
sub(" .*", "", grep("^\\S.*function", readLines("myscript.R"), value = TRUE))
As vantagens dessa abordagem são que
é muito simples . As regras são simplesmente declaradas e há apenas uma linha simples de código R necessária para extrair os nomes das funções. O Regex também é simples e, para um arquivo existente, é muito fácil verificar - apenas cumprimente a palavra functione verifique se cada ocorrência exibida segue a regra.
não há necessidade de executar a fonte. É totalmente estático .
em muitos casos, você não precisará alterar o arquivo de origem e, em outros, haverá alterações mínimas. Se você estiver escrevendo o script do zero, com isso em mente, é ainda mais fácil organizar.
Existem muitas outras alternativas ao longo da ideia de convenções. você pode ter um regex mais sofisticado ou adicionar # FUNCTIONno final da primeira linha de qualquer definição de função se estiver escrevendo o script do zero e depois cumprimentar essa frase e extrair a primeira palavra da linha, mas a principal sugestão aqui parece particularmente atraente devido à sua simplicidade e às outras vantagens listadas.
Teste
# 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(), mas esse segmento antigo pode ser do seu interesse.