Grając z funkcją w R, odkryłem, że jest w niej więcej aspektów niż to, co widać na pierwszy rzut oka.Co/gdzie są atrybuty obiektu funkcji?
Rozważmy THS proste przypisanie funkcji, wpisane bezpośrednio w konsoli:
f <- function(x)x^2
Zwykła „atrybuty” od f
, w szerokim tego słowa znaczeniu, to: (i) wykaz formalnych argumentów, (ii) ekspresji ciała i (iii) środowiska, które będzie obudową ramki oceny funkcji. Są one dostępne za pośrednictwem:
> formals(f)
$x
> body(f)
x^2
> environment(f)
<environment: R_GlobalEnv>
Ponadto str
powraca Więcej informacji dołączony do f
:
> str(f)
function (x)
- attr(*, "srcref")=Class 'srcref' atomic [1:8] 1 6 1 19 6 19 1 1
.. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x00000000145a3cc8>
Spróbujmy je osiągnąć:
> attributes(f)
$srcref
function(x)x^2
To jest drukowane jako tekst, ale jest przechowywany jako wektor liczbowy:
> c(attributes(f)$srcref)
[1] 1 6 1 19 6 19 1 1
I to obiekt posiada również własne atrybuty:
> attributes(attributes(f)$srcref)
$srcfile
$class
[1] "srcref"
Pierwszy z nich to środowisko, z 3 wewnętrznych obiektów:
> mode(attributes(attributes(f)$srcref)$srcfile)
[1] "environment"
> ls(attributes(attributes(f)$srcref)$srcfile)
[1] "filename" "fixedNewlines" "lines"
> attributes(attributes(f)$srcref)$srcfile$filename
[1] ""
> attributes(attributes(f)$srcref)$srcfile$fixedNewlines
[1] TRUE
> attributes(attributes(f)$srcref)$srcfile$lines
[1] "f <- function(x)x^2" ""
Tu jesteś! Jest to ciąg używany przez R do drukowania attributes(f)$srcref
.
więc pytania są:
Czy są jakieś inneobiekty związane
f
? Jeśli tak, jak do nich dotrzeć?Jeśli usuniemy
f
z jego atrybutów, używającattributes(f) <- NULL
, nie ma to wpływu na funkcję. Czy są jakieś wady tego działania?
Jestem bardzo sceptyczny wobec twojego roszczenia nr 2. O ile nie pokonałeś wypieku z pozbawionej funkcji, w tym pośrednich wywołań środowiskowych, modyfikując jego elementy "ciała", a raczej o wielu rzeczach, o których nie wiem, możesz uspokoić to stwierdzenie. –
@CarlWitthoft, Próbowałem użyć 'attributes (f) <- NULL' z funkcją, która ma środowisko inne niż' R_GlobalEnv' (i faktycznie szuka symbolu w swojej obudowie) i nadal działa. Ponadto użycie 'body <-' automatycznie usuwa funkcję z jej atrybutów. Biorąc pod uwagę odpowiedź Josha poniżej, istnieje nawet opcja, aby te atrybuty pozostawały puste od samego początku. Czy możesz zaproponować kolejny test, w którym potrzebne są atrybuty? –