Поиск…


Именованные функции

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

Функция может быть очень простой, до такой степени, что она почти бессмысленна. Это даже не нужно принимать аргумент:

one <- function() { 1 }
one()
[1] 1

two <- function() { 1 + 1 }
two()
[1] 2

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

Функция может быть очень простой, но очень специфичной. Эта функция принимает на входе вектор ( vec в этом примере) и выводит один и тот же вектор с длиной вектора (6 в этом случае), вычитаемым из каждого из элементов вектора.

vec <- 4:9
subtract.length <- function(x) { x - length(x) }
subtract.length(vec)
[1] -2 -1  0  1  2  3

Обратите внимание, что length() сама по себе является предустановленной (т.е. базовой ) функцией. Вы можете, конечно, использовать ранее выполненную самодельную функцию в рамках другой самодельной функции, а также назначать переменные и выполнять другие операции, охватывая несколько строк:

vec2 <- (4:7)/2

msdf <- function(x, multiplier=4) {
    mult <- x * multiplier
    subl <- subtract.length(x)
    data.frame(mult, subl)
}

msdf(vec2, 5)
  mult subl
1 10.0 -2.0
2 12.5 -1.5
3 15.0 -1.0
4 17.5 -0.5

multiplier=4 гарантирует, что 4 является значением по умолчанию для multiplier аргументов, если значение не задано при вызове функции 4 это то, что будет использоваться.

Вышеприведенные примеры всех названных функций называются просто потому, что им даны имена ( one , two , subtract.length и т. Д.),

Анонимные функции

Анонимная функция, как следует из названия, не назначает имя. Это может быть полезно, когда функция является частью более крупной операции, но сама по себе не занимает много места. Одна из наиболее частых вариантов использования анонимных функций в *apply семейство функций базы.

Вычислить средний квадрат корня для каждого столбца в data.frame :

df <- data.frame(first=5:9, second=(0:4)^2, third=-1:3)

apply(df, 2, function(x) { sqrt(sum(x^2)) })
    first    second     third 
15.968719 18.814888  3.872983 

Создайте последовательность шагов по длине от наименьшего до наибольшего значения для каждой строки в матрице.

x <- sample(1:6, 12, replace=TRUE)
mat <- matrix(x, nrow=3)

apply(mat, 1, function(x) { seq(min(x), max(x)) })

Анонимная функция также может стоять сама по себе:

(function() { 1 })()
[1] 1

эквивалентно

f <- function() { 1 })
f()
[1] 1

Фрагменты кода RStudio

Это всего лишь небольшой взлом для тех, кто часто использует самоопределяемые функции.
Введите «fun» RStudio IDE и нажмите «TAB».

введите описание изображения здесь

Результатом будет скелет новой функции.

name <- function(variables) {
        
}

Можно легко определить собственный шаблон фрагмента, т. Е. Тот, который приведен ниже

name <- function(df, x, y) {
        require(tidyverse)
        out <- 
        return(out)
}

Опция « Edit Snippets в меню « Global Options -> Code .

Передача имен столбцов в качестве аргумента функции

Иногда хотелось бы передать имена столбцов из фрейма данных в функцию. Они могут быть представлены в виде строк и использоваться в функции с помощью [[ . Давайте посмотрим на следующий пример, который выводит на базовую статистику R-групп выбранных переменных:

basic.stats <- function(dset, vars){
    for(i in 1:length(vars)){
        print(vars[i])
        print(summary(dset[[vars[i]]]))
    }
}

basic.stats(iris, c("Sepal.Length", "Petal.Width"))

В результате выполнения вышеописанного кода в R-консоли печатаются имена выбранных переменных и их основные сводные статистические данные (минимумы, первые квантили, медианы, средства, третьи кванты и максимумы). Код dset[[vars[i]]] выбирает i-й элемент из аргументов vars и выбирает соответствующий столбец в объявленном наборе данных dset . Например, объявление только iris[["Sepal.Length"]] будет печатать столбец Sepal.Length из набора данных iris как вектор.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow