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



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



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


И тогда мы называем отсечение с:



 cutoff(x) <- 65


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

574   3  
r

3 ответов:

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

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)

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

Гэвин дает превосходное обсуждение интерпретации функции замены. Я хотел дать рекомендацию, так как вы также просили об этом.: определение языка R раздел 3.4.4: назначение подмножеств .

Помните, что в 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

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

Comments

    Ничего не найдено.