Можете Вы передача ссылкой в R?

Можно ли передать ссылкой с "R"? например, в следующем коде:

setClass("MyClass",
    representation(
    name="character"
    ))


instance1 <-new("MyClass",name="Hello1")
instance2 <-new("MyClass",name="Hello2")

array = c(instance1,instance2)

instance1
array

instance1@name="World!"

instance1
array

вывод

> instance1
An object of class “MyClass”
Slot "name":
[1] "World!"

> array
[[1]]
An object of class “MyClass”
Slot "name":
[1] "Hello1"


[[2]]
An object of class “MyClass”
Slot "name":
[1] "Hello2"

но мне жаль, что это не было

> instance1
An object of class “MyClass”
Slot "name":
[1] "World!"

> array
[[1]]
An object of class “MyClass”
Slot "name":
[1] "World!"


[[2]]
An object of class “MyClass”
Slot "name":
[1] "Hello2"

действительно ли это возможно?

66
задан David Arenburg 1 May 2018 в 10:45
поделиться

2 ответа

Нет .

Объекты в операторах присваивания неизменяемы. R скопирует объект, а не , а только ссылку.

> v = matrix(1:12, nrow=4)
> v
           [,1] [,2] [,3]
     [1,]    1    5    9
     [2,]    2    6   10
     [3,]    3    7   11
     [4,]    4    8   12
> v1 = v
> v1[,1]     # fetch the first column 
     [1] 1 2 3 4

( оговорка : приведенное выше утверждение верно для примитивов R , например, векторы, матрицы), а также для функций ; Я не могу с уверенностью сказать, верно ли это для всех R-объектов - только для большинства из них, а также для подавляющего большинства наиболее часто используемых.)

Если вам не нравится такое поведение вы можете отказаться от него с помощью пакета R. Например, существует пакет R под названием R.oo , который позволяет имитировать поведение передачи по ссылке; R.oo доступен на CRAN .

55
ответ дан 24 November 2019 в 14:55
поделиться

Передача по ссылке возможна для среды s. Чтобы использовать их, в основном всякий раз, когда вы создаете объект, вам также нужно будет создать слот среды. Но я считаю, что это громоздко. Взгляните на Пропустить по ссылке для S4. и Указатели и переход по ссылке в R

18
ответ дан 24 November 2019 в 14:55
поделиться