Подтвердить что ты не робот

Есть ли способ вызвать функцию `[<-` в` [`form?

Предположим, что я ленивый программист с плохими привычками (кто также не знает о plyr/dplyr), мне нравится делать такие операции:

`[<-`((z<-reshape2::melt(iris)), z[,"value"]>5, 3, 100)

Расплавьте iris, затем присвойте значение 100 строкам, где value больше 5, затем верните все строки, а не только выбранные строки. Эта функция описана на странице ?"["

Тот же код с replace() (ну почти один и тот же)

 z[,"value"] <- replace(i <- ((z <- reshape2::melt(iris))[,"value"]), i > 5, 100)

1) Но возникает вопрос: существует ли способ вызвать функцию [<- с использованием стандартного обозначения скобок iris[<-, blah, blah, blah, ?]?

edit July 2016: поэтому целью этого вопроса НЕ является повторение операции. Данные не имеют значения, пример не имеет значения, запутанный способ изменения данных не имеет значения.

4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос: конечно. Для

iris[<-, blah, blah, blah, ?]

функция [ должна использовать другую функцию (или оператор) в качестве второго аргумента, а [ - это примитив, который этого не позволяет.

Вы можете утверждать, что "но функция называется [<-". Это не. Если вы пишете

x[i,j,...]

Затем вы вызываете функцию [ с первым аргументом x, вторым аргументом i и т.д. В вашей строке кода i есть функция <-. Оператор присваивания действительно является функцией:

> `<-`
.Primitive("<-")
> `<-`("x",1)
> x
[1] 1

Итак, что вы пишете в этой строке, сводится к:

`[`(iris, <-, blah, blah ... )

и это даст ошибку в интерпретаторе R; оператор присваивания интерпретируется как попытка присвоить что-то. Это явно неверный код.

Вы можете предлагать использовать обратные такты, чтобы он стал:

iris[`<-`, blah, blah, ... ]

который переводится на

`[`(iris, `<-`, blah, blah ,... )

но и это то, что не является и никогда не будет разрешено примитивным [.

Некоторые люди предложили вам написать свой собственный метод, и вы можете - для классов, которые вы сами определили. Но вы не можете переопределить [ сам, чтобы разрешить это для любого общего фрейма данных, если только вы не переписываете интерпретатор R, чтобы распознать вашу конструкцию как вызов [<- вместо [.