2014 dxdy logo

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

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




 
 Странный синтаксис языка R: вызов функции
Сообщение04.09.2019, 18:02 
Давайте зададим вектор при помощи конкатенации
Используется синтаксис 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 
Насколько я понял (никогда не работал с R) функция names() возвращает атрибут имён вектора (атрибут names) и данным синтаксисом вы просто присваиваете этому атрибуту значение. Поэтому ваш вектор с именами. Если просто вызвать names(x) (до присваивания), то он возвратит пустоту, а если после - список присвоенных имён. Вызов вектора уже отображает значения в векторе с полученными именами.

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

 
 
 
 Re: Странный синтаксис языка R: вызов функции
Сообщение04.09.2019, 20:07 
А, понял. Когда 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 
Только называть этот синтаксис странным некорректно, он не более странен чем скажем в C# свойств
Используется синтаксис C#
object Property {
  get {}
  set {}
}

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

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group