Что такое замещающие функции в 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 (различные технические проблемы), но я не нашел дальнейшего обсуждения в официальной документации).
Ответ 2
Гэвин отлично обсуждает интерпретацию функции замены. Я хотел бы предоставить ссылку, так как вы также просили об этом: Определение языка R Раздел 3.4.4: Назначение подмножества.
Ответ 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, найти здесь.