W R używam source()
do załadowania niektórych funkcji:
source("functions.R")
Czy można uzyskać listę wszystkich funkcji zdefiniowanych w tym pliku? Jako nazwy funkcji. (Możesource()
sam może to jakoś zwrócić?).
PS: Ostatnim rozwiązaniem byłoby wywoływanie source()
po raz drugi jak, local({ source(); })
a następnie wykonywanie funkcji ls()
wewnętrznych i filtrowanie, ale to zbyt skomplikowane - czy jest łatwiejsze i mniej niezręczne rozwiązanie?
source()
, ale ten stary wątek może Cię zainteresować.envir <- new.env() source("functions.R", local=envir) lsf.str(envir)
Odpowiedzi:
Myślę, że najlepszym sposobem byłoby źródło pliku w tymczasowym środowisku. Zapytaj to środowisko dla wszystkich funkcji, a następnie skopiuj te wartości do środowiska nadrzędnego.
źródło
new.env()
zamiast eleganckiego,local({ })
którego nie jestem pewien, czy zadziała zassign
ramką nadrzędną.local()
? I BTW, 2) co robisz w pętli for: czy nie ma funkcji scalania środowisk?attach
można go wykorzystać do połączenia jednego środowiska z drugim. Chociaż musisz użyćpos
argumentu zamiast określaćparent.frame
. I będzie działał dobrze tylko do kopiowania całego środowiska,for
pętla MrFlick pozwala kopiować tylko funkcje.Jest to trochę niezgrabne, ale możesz zobaczyć zmiany w obiektach przed i po
source
wywołaniu w ten sposób.źródło
Myślę, że to wyrażenie regularne przechwytuje prawie każdy poprawny typ funkcji (operator binarny, funkcje przypisania) i każdy poprawny znak w nazwie funkcji, ale mogłem nie zauważyć wielkości krawędzi.
źródło
.
i funkcje przypisania (`foo<-`<- function(x, value)
istnieją.=
do przypisania, to nie złapie żadnej z moich funkcji ...` d d` <- function(x)
które nie są obecnie łapane. Nie chcę, aby wyrażenie regularne stało się zbyt głupie, chociaż mogę wrócić.assign
,<<-
, i->
. Bardzo trudno będzie uczynić to podejście rachunkiem dla funkcji, które są zdefiniowane w ramach funkcji, ale tak naprawdę nie znajdują się w środowisku źródłowym. Twoja odpowiedź powinna działać bardzo dobrze w standardowych przypadkach, ale tak naprawdę nie chcesz pisać parsera R z wyrażenia regularnego.Jeśli jest to twój własny skrypt, który pozwala kontrolować sposób jego formatowania, wystarczy zwykła konwencja. Upewnij się tylko, że nazwa każdej funkcji zaczyna się od pierwszego znaku w linii i że słowo
function
pojawia się również w tej linii. Każde inne użycie tego słowafunction
powinno pojawić się w wierszu rozpoczynającym się spacją lub tabulatorem. Zatem jedno-liniowe rozwiązanie to:Zalety tego podejścia są takie
to jest bardzo proste . Reguły są po prostu określone i jest tylko jedna prosta linia kodu R potrzebna do wyodrębnienia nazw funkcji. Regex jest również prosty, a dla istniejącego pliku bardzo łatwo go sprawdzić - po prostu grep słowo
function
i sprawdź, czy każde wyświetlane wystąpienie jest zgodne z regułą.nie ma potrzeby uruchamiania źródła. Jest całkowicie statyczny .
w wielu przypadkach nie trzeba wcale zmieniać pliku źródłowego, a w innych będą minimalne zmiany. Jeśli piszesz skrypt od nowa, mając na uwadze to, łatwiej jest go zorganizować.
Istnieje wiele innych alternatyw związanych z ideą konwencji. możesz mieć bardziej wyrafinowane wyrażenie regularne lub możesz dodać
# FUNCTION
na końcu pierwszego wiersza dowolnej definicji funkcji, jeśli piszesz skrypt od zera, a następnie wyszukujesz tę frazę i wyodrębniasz pierwsze słowo z wiersza, ale główna sugestia wydaje się tutaj szczególnie atrakcyjny ze względu na swoją prostotę i inne wymienione zalety.Test
źródło
lapply(x, function(y) dostuff(y))
# TODO
całym kodzie, aby na przykład grep mój do zrobienia. Inną możliwością w tym samym# FUNCTION
wierszu byłoby zapisanie na końcu pierwszego wiersza dowolnej definicji funkcji.To dostosowuje kod użyty w poście z mojego komentarza, aby wyszukać sekwencję tokenów (symbol, operator przypisania, a następnie funkcja) i powinien pobrać dowolne zdefiniowane funkcje. Nie jestem pewien, czy jest solidny jako odpowiedź MrFlick, ale jest to inna opcja:
źródło