Играя с функцией в R, я обнаружил, что в ней есть больше аспектов, чем кажется на первый взгляд.Что/Где атрибуты функционального объекта?
Рассмотрим THS простое задание функции, набранный непосредственно в консоли:
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"
Первый является средой, с 3-мя внутренними объектами:
> 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
, это, похоже, не влияет на функцию. Есть ли недостатки в этом?
Я очень скептически отношусь к вашей претензии №2. Если вы не избили начинку из урезанной функции, включая косвенные вызовы окружения, изменяя ее элементы тела, и, скорее, много вещей, о которых я не знаю, вы можете захотеть смягчить эту инструкцию. –
@CarlWitthoft, я попытался использовать атрибуты (f) <- NULL' с функцией, отличной от «R_GlobalEnv» (и фактически ищет символ в своем приложении), и она по-прежнему работает. Кроме того, использование 'body <-' автоматически блокирует функцию из ее атрибутов. Учитывая ответ Джоша ниже, существует даже возможность сохранить эти атрибуты пустым с самого начала. Можете ли вы предложить еще один тест, в котором нужны атрибуты? –