No R, estou usando source()
para carregar algumas funções:
source("functions.R")
É possível obter a lista de todas as funções definidas neste arquivo? Como nomes de funções. (Talvez source()
ele próprio possa devolvê-lo de alguma forma?).
PS: O último recurso seria chamar a source()
segunda vez como local({ source(); })
e depois ls()
executar funções internas e de filtro, mas isso é muito complicado - existe solução mais fácil e menos desajeitada?
source()
, mas esse segmento antigo pode ser do seu interesse.envir <- new.env() source("functions.R", local=envir) lsf.str(envir)
Respostas:
Eu acho que a melhor maneira seria originar o arquivo em um ambiente temporário. Consulte esse ambiente para todas as funções e copie esses valores para o ambiente pai.
fonte
new.env()
vez do elegantelocal({ })
que não tenho certeza se funcionaria com oassign
quadro pai.local()
? E BTW, 2) o que você faz no loop for: não há alguma função para mesclar ambientes?attach
pode ser usado para, bem, conectar um ambiente a outro. Embora você precise usar opos
argumento em vez de especificar oparent.frame
. E isso só funcionará bem para copiar todo o ambiente, ofor
loop do MrFlick permite copiar apenas as funções.É um pouco desajeitado, mas você pode observar alterações nos objetos antes e depois da
source
chamada dessa maneira.fonte
Eu acho que esse regex captura quase todos os tipos de funções válidas (operador binário, funções de atribuição) e todos os caracteres válidos em um nome de função, mas eu posso ter perdido um caso extremo.
fonte
.
e funções de atribuição (`foo<-`<- function(x, value)
exist.=
para atribuição, isso não vai pegar nenhuma das minhas funções ...` d d` <- function(x)
que atualmente não são capturadas. Eu não quero que o regex fique muito bobo, embora eu possa revisitar.assign
,<<-
e->
. E será muito difícil tornar essa abordagem responsável pelas funções definidas dentro das funções, mas que não estão realmente no ambiente de origem. Sua resposta deve funcionar muito bem para casos padrão, mas você realmente não deseja escrever um analisador R a partir de regex.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
function
também aparece nessa linha. Qualquer outro uso da palavrafunction
deve aparecer em uma linha que começa com um espaço ou tabulação. Em seguida, uma solução de uma linha é: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
function
e 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
# FUNCTION
no 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
fonte
lapply(x, function(y) dostuff(y))
iria quebrar isso# TODO
todo o meu código para que eu possa cumprimentar minhas tarefas, por exemplo. Outra possibilidade ao longo das mesmas linhas seria escrever# FUNCTION
no final da primeira linha de qualquer definição de função.Isso adapta o código usado na postagem do meu comentário para procurar uma sequência de tokens (símbolo, operador de atribuição e depois função), e deve pegar todas as funções definidas. Não tenho certeza se é robusto como resposta do MrFlick, mas é outra opção:
fonte