Играя с функцией в R, я обнаружил, что в ней есть больше аспектов, чем кажется на первый взгляд.
Рассмотрим простое назначение функций, введенное непосредственно в консоли:
f <- function(x)x^2
Обычными "атрибутами" f
в широком смысле являются (i) список формальных аргументов, (ii) выражение тела и (iii) среда, которая будет оболочкой рамки оценки функции, Они доступны через:
> formals(f)
$x
> body(f)
x^2
> environment(f)
<environment: R_GlobalEnv>
Кроме того, str
возвращает дополнительную информацию, привязанную к 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>
Попытайтесь связаться с ними:
> attributes(f)
$srcref
function(x)x^2
Это печатается как текст, но сохраняется как числовой вектор:
> c(attributes(f)$srcref)
[1] 1 6 1 19 6 19 1 1
И этот объект также имеет свои собственные атрибуты:
> attributes(attributes(f)$srcref)
$srcfile
$class
[1] "srcref"
Первая - это среда с тремя внутренними объектами:
> 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" ""
Вот ты! Это строка, используемая R для печати attributes(f)$srcref
.
Итак, вопросы:
-
Есть ли другие объекты, связанные с
f
? Если да, то как их достичь? -
Если мы разделим
f
его атрибутов, используяattributes(f) <- NULL
, это, похоже, не влияет на функцию. Есть ли недостатки в этом?