2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Странный синтаксис языка R: вызов функции
Сообщение04.09.2019, 18:02 


10/03/16
3862
Aeroport
Давайте зададим вектор при помощи конкатенации
Используется синтаксис Python
x <- c(1, 2, 3)

и поименуем его элементы. Как рассуждает нормальный программист нубло вроде меня: надо вызвать некую функцию и передать ей список имён элементов вектора и ссылку на сам вектор. Как это делается на самом деле? вот так:
Используется синтаксис Python
names(x) <- c("firstEl", "secondEl", "thirdEl")

я конечно не специалист, но вроде меня учили, что в функцию передается копия объекта (в данном случае вектора), и функция внутри себя не может изменить оригинал. Однако приведенный код работает, и у элементов вектора
Используется синтаксис Python
x
таки появляются имена. Вопросов два:

1. Как это вообще работает?
2. У меня есть подозрение, что это просто класс функций, каким-то образом получающих объект по ссылке и потому способных менять его свойства. Как самому написать такую функцию?

P.S. Не обращайте внимание на слово Pyton - это код на R. Я просто не нашел подсветку для R.

 Профиль  
                  
 
 Re: Странный синтаксис языка R: вызов функции
Сообщение04.09.2019, 18:44 


22/06/09
975
Насколько я понял (никогда не работал с R) функция names() возвращает атрибут имён вектора (атрибут names) и данным синтаксисом вы просто присваиваете этому атрибуту значение. Поэтому ваш вектор с именами. Если просто вызвать names(x) (до присваивания), то он возвратит пустоту, а если после - список присвоенных имён. Вызов вектора уже отображает значения в векторе с полученными именами.

 Профиль  
                  
 
 Re: Странный синтаксис языка R: вызов функции
Сообщение04.09.2019, 19:41 


16/08/19
70
Ответ не верный. Обычная С++шная логика в R не работает, это очень специфический язык, простой, но специфический.
Тут все очень просто, есть специальная функция установки names<-(x, values) которая уже и транслируется в синтаксическую конструкцию names(x) <- values.
Написать свою функцию очень просто, просто в этот образец подставить вместо names свое имя функции. Надо просто помнить что в R вообще всё является объектами.

 Профиль  
                  
 
 Re: Странный синтаксис языка R: вызов функции
Сообщение04.09.2019, 20:07 


22/06/09
975
А, понял. Когда R видит конструкцию типа:
Используется синтаксис Python
func(x) <- a

он ищет функцию с наименованием "func<-" и вызывает её с аргументами (x, a), и она уже внутри себя модифицирует x.

Если я правильно понял написанное здесь (companion website for “Advanced R”), такая функция создаёт модифицированную копию объекта и возвращает её (меняя адрес, куда ссылается переменная x?)
Цитата:
I say they “act” like they modify their arguments in place, because they actually create a modified copy. We can see that by using pryr::address() to find the memory address of the underlying object.

Но примитивные функции (как names<-) меняют объект напрямую:
Цитата:
Built-in functions that are implemented using .Primitive() will modify in place

 Профиль  
                  
 
 Re: Странный синтаксис языка R: вызов функции
Сообщение16.09.2019, 16:04 


16/08/19
70
Только называть этот синтаксис странным некорректно, он не более странен чем скажем в C# свойств
Используется синтаксис C#
object Property {
  get {}
  set {}
}

по смыслу это тоже самое что в R
Используется синтаксис Javascript
 Property <- function(x) {}
`Property<-` <- function(x, val) {}

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group