Установка эквивалента .subset2 в R?

#r #subset #r6

Вопрос:

В R я могу использовать .subset2 , чтобы действовать как a [[ или $ без отправки.

 > a <- new.env()
> a$foo  <- 3
> .subset2(a, "foo")
[1] 3
 

Однако я, похоже, не могу найти эквивалент для операции настройки без отправки:

 > .subset2(a, "foo") <- 5
 

Ошибка в .subset2(a, «foo») <- 5 : не удалось найти функцию
«.subset2

Как я могу что-то установить без неявной диспетчеризации с использованием операторов [[<- или $<- ?

Комментарии:

1. что с ними не так? чего вы пытаетесь добиться, чего нельзя добиться без какого-то рода .subset2<-() ?

2. @mnist нет .подмножество 2-

3. @mnist Я пытаюсь переопределить поведение доллара для некоторых классов R6. Я вхожу в рекурсию, если есть отправка.

4. «Я пытаюсь переопределить поведение доллара для некоторых классов R6». Означает ли это, что вы намерены замаскировать $<- функцию? Это может иметь серьезные последствия для производительности. Я бы рекомендовал .Primitive не использовать функции маскировки.

5. @Roland Меня не волнует производительность. Я хочу, чтобы возникала ошибка, когда я ссылаюсь на что-то, чего не существует. Вы, люди, слишком озабочены производительностью

Ответ №1:

Возможно, вы ищете assign :

Описание: Присвоение значения имени в среде.

 assign("foo", 5, envir = a)
 

Кстати, вместо использования .subset2 (которое является внутренней функцией в базовом пакете и может быть перепутано с subset ), вы можете захотеть использовать get :

 get("foo", envir = a)
# [1] 5
 

Ответ №2:

Может быть, мы сможем попробовать

 with(a,assign("foo",5))
 

или

 with(a, `<-`(foo, 5))
 

или

 a$foo <- 5
 

Ответ №3:

Я не совсем уверен, что это то, что вам нужно, но это соответствует предварительным требованиям по установке значения foo в a среде без явного использования операторов $ , [ , [[ , <- :

 # Your code:
a <- new.env()
a$foo  <- 3
.subset2(a, "foo")
# Solution:
list2env(
  list(
    foo = 5
  ), 
  env = a
)
# Proof:
a$foo