Stworzyłem skrypt narzędzia R, util.R, którego chcę używać z innych skryptów w moim projekcie. Jaki jest właściwy sposób, aby zapewnić, że funkcja zdefiniowana w tym skrypcie będzie działać w innych moich skryptach?
Szukam czegoś podobnego do require
funkcji, która ładuje paczkę tylko wtedy, gdy nie została jeszcze załadowana. Nie chcę dzwonić, source("util.R")
ponieważ spowoduje to załadowanie skryptu za każdym razem, gdy zostanie wywołany.
Wiem, że dostanę kilka odpowiedzi, które każą mi stworzyć pakiet, tak jak w Organizowaniu kodu źródłowego R :) Ale nie tworzę czegoś, co będzie używane gdzie indziej, to tylko samodzielny projekt.
Odpowiedzi:
Oto jeden możliwy sposób. Użyj tej
exists
funkcji, aby sprawdzić coś unikalnego w swoimutil.R
kodzie.Na przykład:
(Zredagowano, aby uwzględnić
mode="function"
, jak wskazał Gavin Simpson)źródło
exists()
- wymagamode = "function"
dodania, aby było niezawodnyexists()
wydaje się zgłaszać błąd, z wyjątkiem zwracania jednego w R 3.0.2.Nie ma czegoś takiego wbudowanego, ponieważ R nie śledzi wywołań
source
i nie jest w stanie dowiedzieć się, co zostało załadowane skąd (nie ma to miejsca w przypadku używania pakietów). Możesz jednak użyć tego samego pomysłu co w.h
plikach C , czyli zawinąć całość w:źródło
source("util.R")
w ramachif
kodu, prawda?Say
util.R
tworzy funkcjęfoo()
. Możesz sprawdzić, czy ta funkcja jest dostępna w środowisku globalnym i pobrać skrypt, jeśli nie jest:To znajdzie wszystko o nazwie
foo
. Jeśli chcesz znaleźć funkcję, to (jak wspomniał @Andrie)exists()
jest pomocne, ale musisz wiedzieć , jakiego typu obiektu szukać, np.Oto
exists()
akcja:źródło
grepl(..., value=TRUE)
ponieważ wyszukiwane hasło prawdopodobnie nie jest wyrażeniem regularnym. Przy okazji +1.grepl()
nie ma argumentuvalue
, ale prawdopodobnie powinienem poprawić wyrażenie regularne wls()
...fixed=TRUE
exists()
jest lepiej, ale widzę, że w międzyczasie opublikowałeś taką odpowiedź.Możesz napisać funkcję, która pobiera nazwę pliku i nazwę środowiska, sprawdza, czy plik został załadowany do środowiska, a
sys.source
jeśli nie, używa go jako źródła.Oto szybka i nieprzetestowana funkcja (mile widziane ulepszenia!):
źródło
Oto funkcja, którą napisałem. Otacza
base::source
funkcję, aby przechowywać listę plików źródłowych w globalnej liście środowiska o nazwiesourced
. Plik zostanie ponownie źródłowy tylko wtedy, gdy podasz.force=TRUE
argument do wywołania źródła. Jego sygnatura argumentów jest poza tym identyczna z rzeczywistą,source()
więc nie musisz przepisywać swoich skryptów, aby z niej korzystać.Jest dość rozmowny (wiele telefonów do
message()
), więc możesz usunąć te linie, jeśli ci zależy. Wszelkie rady od doświadczonych użytkowników języka R są mile widziane; Jestem całkiem nowy w R.źródło
Rozwiązałem swój problem używając całego adresu, gdzie mój kod to: Przed:
Po:
źródło