Что такое замещающие функции в R?

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

"cutoff<-" <- function(x, value){
 x[x > value] <- Inf
 x
 }

а затем мы вызываем обрезание с:

 cutoff(x) <- 65

Может ли кто-нибудь объяснить, что функция замены находится в R?

Ответ 1

Когда вы вызываете

cutoff(x) <- 65

вы фактически вызываете

x <- "cutoff<-"(x = x, value = 65)

Имя функции должно быть указано как синтаксически допустимое, но нестандартное имя, и синтаксический анализатор интерпретирует <- как оператор не как часть имени функции, если он не цитируется.

"cutoff<-"() аналогичен любой другой функции (хотя и с странным именем); он меняет свой входной аргумент на основе value (в этом случае он устанавливает любое значение в x больше 65 до Inf (бесконечное)).

Магия действительно выполняется, когда вы вызываете функцию, подобную этой

cutoff(x) <- 65

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

В общем случае мы имеем

FUN(obj) <- value

R находит функцию "FUN<-"() и устанавливает вызов путем передачи obj и value в "FUN<-"() и упорядочивает результат "FUN<-"() на obj, поэтому он вызывает:

obj <- "FUN<-"(obj, value)

Полезной ссылкой для этой информации является R Определение языка Раздел 3.4.4: Назначение подмножества; дискуссия немного наклонная, но, по-видимому, она является самой официальной ссылкой (функции замены упоминаются в распространении часто задаваемых вопросов R (различия между R и S-PLUS) и в справочной системе R (различные технические проблемы), но я не нашел дальнейшего обсуждения в официальной документации).

Ответ 3

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

colnames(d) <- c("Input", "Output")

Они имеют идентификатор <- в конце своего имени и возвращают измененную копию объекта аргумента (не примитивные функции замены) или тот же объект (примитивные функции замены)

В командной строке R не будет работать следующее:

> `second` <- function(x, value) {
+   x[2] <- value
+   x
+ }
> x <- 1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> second(x) <- 9
Error in second(x) <- 9: couldn't find function "second<-"

Как вы можете видеть, R ищет среду не для second, а для second<-. Так что сделайте то же самое, но вместо этого используйте такой идентификатор функции:

> `second<-` <- function(x, value) {
+   x[2] <- value
+   x
+ }

Теперь задание во второй позиции вектора работает:

> second(x) <- 9
> x
 [1]  1  9  3  4  5  6  7  8  9 10

Я также написал простой script, чтобы перечислить все функции замены в базовом пакете R, найти здесь.