Что такое функции замены в R?
Я искал ссылку, чтобы узнать о функциях замены в R, но пока не нашел ни одной. Я пытаюсь понять концепцию функций замены в R. У меня есть код ниже, но я его не понимаю:
"cutoff<-" <- function(x, value){
x[x > value] <- Inf
x
}
И тогда мы называем отсечение с:
cutoff(x) <- 65
Может ли кто-нибудь объяснить, что такое функция замены в R?
3 ответов:
Когда вы звоните
cutoff(x) <- 65Вы фактически вызываете
x <- "cutoff<-"(x = x, value = 65)Имя функции должно быть заключено в кавычки, поскольку это синтаксически допустимое, но нестандартное имя, и синтаксический анализатор интерпретировал бы
<-как оператор, а не как часть имени функции, если бы оно не было заключено в кавычки.
"cutoff<-"()это так же, как и любая другая функция (хотя и со странным именем); она изменяет свой входной аргумент на основеvalue(в этом случае она устанавливает любое значение вxбольше, чем65кInf(бесконечно)).Волшебство действительно происходит, когда вы вызываете функцию вот так
cutoff(x) <- 65Потому что R анализирует это и вытаскивает различные биты, чтобы сделать реальный вызов, показанный выше.
Более обобщенно мы имеем
FUN(obj) <- valueR находит функцию
"FUN<-"()и устанавливает вызов, передаваяobjиvalueв"FUN<-"()и организует, чтобы результат"FUN<-"()был назначен обратноobj, поэтому он вызывает:obj <- "FUN<-"(obj, value)Полезная ссылка для этой информации есть раздел 3.4.4 определения языка R: назначение подмножества ; обсуждение немного косо, но, похоже, является самой официальной ссылкой (функции замены упоминаются попутно в R FAQ (различия между R и S-PLUS) и в справочнике языка R (различные технические вопросы), но я не нашел никакого дальнейшего обсуждения в официальной документации).
Гэвин дает превосходное обсуждение интерпретации функции замены. Я хотел дать рекомендацию, так как вы также просили об этом.: определение языка R раздел 3.4.4: назначение подмножеств .
Помните, что в R все операции-это вызов функции (следовательно, и операции присваивания), а все, что существует, - это объект. Функции замены действуют так, как если бы они изменяли свои аргументы на месте, например, в
colnames(d) <- c("Input", "Output")Они имеют идентификатор
<-в конце своего имени и возвращают модифицированную копию объекта аргумента (непримитивные функции замены) или того же объекта (примитивные функции замены)В командной строке R не будет показано следующее работа:
Как вы можете видеть, 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<-"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Я также написал простой скрипт для перечисления всех функций замены в базовом пакете R, найдите его здесь.
Comments