Топ-10 ошибок при использовании R и как их исправить

Топ-10 ошибок при использовании R и их исправление

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

К счастью, я заставил себя продолжать несмотря на трудности начала. И сегодня, даже если я все еще сталкиваюсь с ошибками почти каждый раз, когда пишу код на R, с опытом и практикой, мне требуется все меньше времени, чтобы их исправить. Если вы тоже испытываете трудности в начале, не волнуйтесь, это нормально: каждый испытывает некоторое разочарование, когда изучает новый язык программирования (и это относится не только к R).

В этой статье я подчеркиваю 10 самых распространенных ошибок в R и как их исправить. Конечно, ошибки зависят от вашего кода и ваших анализов, поэтому невозможно рассмотреть их все (и Google делает это гораздо лучше меня). Однако я хотел бы сосредоточиться на некоторых распространенных синтаксических ошибках, которые часто возникают при изучении R и которые иногда могут занимать длительное время на исправление, прежде чем понять, что решение находится прямо перед нашими глазами.

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

Для каждой ошибки я привожу примеры и решения для их исправления. В конце статьи я также упоминаю несколько предупреждений (которые, строго говоря, не являются ошибками).

1. Несогласованные скобки, фигурные скобки, квадратные скобки или кавычки

Одна довольно тривиальная, но все равно довольно частая ошибка – это пропущенные скобки, фигурные скобки, квадратные скобки или кавычки.

Этот тип ошибки применим ко многим языкам программирования. В R, например:

## пропущена закрывающая скобка:    mean(c(1, 7, 13)     ## пропущена фигурная скобка перед "else":    x <- 7 if(x > 10) {  print("x > 10") else {  print("x <= 10") }  ## пропущена квадратная скобка:    summary(ggplot2::diamonds[, "price")## пропущена закрывающая кавычка во 2-м элементе:    grp <- c("Group 1", "Group 2) grp

Такие ошибки легко обнаружить, когда код является простым, но могут быть гораздо сложнее увидеть в более сложном коде, например:1

for (i in y) {  for (j in x) {    p <- ggboxplot(dat,      x = colnames(dat[j]), y = colnames(dat[i]),      color = colnames(dat[j]),      legend = "none",      palette = "npg",      add = "jitter"    )    print(      p + stat_compare_means(aes(label = paste0(..method.., ", p-value = ", ..p.format..),        method = method1, label.y = max(dat[, i], na.rm = TRUE)      )      + stat_compare_means(comparisons = my_comparisons, method = method2, label = "p.format")    )  }

К счастью, если вы используете RStudio,2 закрывающая скобка, фигурная скобка, квадратная скобка или кавычка будут автоматически добавлены, когда вы открываете их.

Помните, что при установке пакета вы обязательно должны использовать (одинарные или двойные) кавычки вокруг его названия:

## НЕПРАВИЛЬНО:    install.packages(ggplot2)

## Ошибка: объект "ggplot2" не найден

Вместо этого напишите один из двух следующих вариантов:

# install.packages("ggplot2")# install.packages('ggplot2')

Решение

Решение, конечно, просто – сопоставить все открывающие скобки, фигурные скобки, квадратные скобки и кавычки соответствующим закрывающим:

mean(c(1, 7, 13))

## [1] 7

x <- 7if (x > 10) {  print("x > 10")} else {  print("x <= 10")}

## [1] "x <= 10"

summary(ggplot2::diamonds[, "price"])

##      price      ##  Min.   :  326  ##  1st Qu.:  950  ##  Median : 2401  ##  Mean   : 3933  ##  3rd Qu.: 5324  ##  Max.   :18823

grp <- c("Группа 1", "Группа 2")grp

## [1] "Группа 1" "Группа 2"

Также убедитесь в следующем:

  • что запятые расставлены правильно:
## Не правильно (перенос строки в неправильном месте):c("Группа 1," "Группа 2")

## Ошибка: неожиданная строковая константа "c(\"Группа 1, \"" в "c(\"Группа 1, \""

## Также не правильно (пропущена запятая):c("Группа 1" "Группа 2")

## Ошибка: неожиданная строковая константа "c(\"Группа 1\" \"" в "c(\"Группа 1\" \""

## правильно:c("Группа 1", "Группа 2")
  • вы используете одинарные и двойные кавычки не смешивая их для одного элемента:
## Не правильно:c("Группа 1')## правильно:c("Группа 1")## также правильно:c('Группа 1')

Обратите внимание, что использование c('Группа 1', "Группа 2") не вызывает ошибку, но для последовательности лучше не смешивать одинарные и двойные кавычки в одном векторе.

2. Использование функции, которая не установлена или не загружена

Если вы столкнулись с такой ошибкой: “Ошибка в …: не удается найти функцию ‘…’”, например:

это означает, что вы пытаетесь использовать функцию, принадлежащую пакету, который еще не установлен или загружен.

Решение

Чтобы решить эту ошибку, вам нужно установить пакет (если его еще нет) и загрузить его с помощью функций install.packages()и library()соответственно:

## install package:install.packages("ggplot2")## load package:library(ggplot2)

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

3. Опечатки в именах функций, переменных, наборов данных, объектов или пакетов

Еще одна распространенная ошибка – это неправильное написание имени функции, переменной, набора данных, объекта или имени пакета, например:

## опечатка в имени функции:maen(c(1, 7, 13))

## Ошибка в maen(c(1, 7, 13)) : не удается найти функцию "maen"

## опечатка в имени переменной:summary(ggplot2::diamonds[, "detph"])

## Ошибка: Столбец `detph` не существует

## опечатка в имени набора данных:data <- data.frame(  x = rnorm(10),  y = rnorm(10))summary(dta[, 2])

## Ошибка в summary(dta[, 2]) : объект 'dta' не найден

## опечатка в имени объекта:test <- c(1, 7, 13)mean(tset)

## Ошибка в mean(tset) : объект 'tset' не найден

## опечатка в имени пакета:library("tydiverse")

## Ошибка в library("tydiverse") : нет пакета с названием ‘tydiverse’

Решение

Убедитесь, что вы правильно написали все функции, переменные, наборы данных, объекты и имена пакетов:

Обратите внимание, что R чувствителен к регистру; mean() считается отличной от Mean() для R!

<!–mean(c(1, 7, 13))

## [1] 7

summary(ggplot2::diamonds[, "depth"])

## depth ## Min. :43.00 ## 1st Qu.:61.00 ## Median :61.80 ## Mean :61.75 ## 3rd Qu.:62.50 ## Max. :79.00

data <- data.frame( x = rnorm(10), y = rnorm(10))data[, 2]

## [1] 1.3048697 2.2866454 -1.3888607 -0.2787888 -0.1333213 0.6359504## [7] -0.2842529 -2.6564554 -2.4404669 1.3201133

test <- c(1, 7, 13)mean(test)

## [1] 7

library(tidyverse)

## ── Подключение основных пакетов tidyverse ────────────────────── tidyverse 2.0.0 ──## ✔ dplyr 1.1.3 ✔ readr 2.1.4## ✔ forcats 1.0.0 ✔ stringr 1.5.0## ✔ ggplot2 3.4.3 ✔ tibble 3.2.1## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0## ✔ purrr 1.0.2 ## ── Конфликты ──────────────────────────────────────────── tidyverse_conflicts() ──## ✖ dplyr::filter() маскирует stats::filter()## ✖ dplyr::lag() маскирует stats::lag()## ℹ Используйте пакет conflicted (<http://conflicted.r-lib.org/>) для принудительного возникновения ошибки во всех конфликтах

Если вы уверены, что правильно написали объект, функцию или набор данных, но все равно получаете ошибку, объявите этот объект / функцию / набор данных перед их использованием!

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

Помните, что написание кода в R-скрипте (в отличие от консоли) не означает его компиляцию. Фактически, вам нужно его выполнить (нажав кнопку “Запустить” или используя сочетание клавиш), чтобы код был выполнен и использован позже. Если у вас все еще возникают сложности с этим, ознакомьтесь с основами R и RStudio.

4. Пропущенные, неправильные или неправильно написанные аргументы в функциях

Большинство функций R требуют аргументов. Например, функции rnorm() требуется указать хотя бы количество наблюдений через аргумент n.

Ваш код не будет работать, если вы не указываете обязательные аргументы или неправильно указываете аргумент. Кроме того, результат может оказаться не таким, как вы ожидаете, если вы неправильно напишете аргумент:

## missing compulsory argument:rnorm()

## Error in rnorm() : argument "n" is missing, with no default

## incorrect argument:rnorm(n = 3, var = 1)

## Error in rnorm(n = 3, var = 1) : unused argument (var = 1)

## misspelled argument:mean(c(1, 7, 13, NA), narm = TRUE)

## [1] NA

Последний фрагмент кода не вызывает ошибку, но результат не является желаемым.

Решение

Чтобы решить эти ошибки, убедитесь, что вы указываете хотя бы все обязательные аргументы функции и правильные аргументы:

  • В функции rnorm() в качестве аргумента нужно указать стандартное отклонение sd также, вместо дисперсии var.
  • Удаление значений NA выполняется с помощью аргумента na.rm вместо narm.
rnorm(n = 3, sd = 1)

## [1] -0.3066386 -1.7813084 -0.1719174

mean(c(1, 7, 13, NA), na.rm = TRUE)

## [1] 7

Если вы не знаете аргументы функции наизусть, вы всегда можете проверить документацию с помощью ?название_функции или помощь(название_функции), например:

?rnorm()## или: помощь(rnorm)

5. Неправильные, неподходящие или несоответствующие типы данных

В R существует несколько типов данных, основные из которых:

  • Числовые
  • Символьные
  • Факторные
  • Логические

Вы знаете, что некоторые операции и анализы возможны и целесообразны только с определенными типами данных.

Например, нецелесообразно вычислять среднее значениеmean факторной или символьной переменной:

gender <- factor(c("female", "female", "male", "female", "male"))mean(gender)

## Предупреждение в mean.default(gender): аргумент не является числовым или логическим: возвращается ## NA

## [1] NA

Точно так же, хотя технически это возможно, не имеет особого смысла строить столбчатую диаграмму дляколичественной непрерывной переменной, потому что в большинстве случаев частота для каждого значения будет равна 1:

barplot(table(rnorm(10)))

(Кстати, если ваши данные еще не отображаются в виде таблицы, не забудьте добавитьtable()внутри функцииbarplot().)

Решение

Убедитесь, что для переменной(ых) интересующего вас анализа вы используете подходящую операцию и тип анализа.

Например:

  • для факторных переменных целесообразно вычислять частоты и/или относительные частоты и строить столбчатые диаграммы
  • для количественных непрерывных переменных целесообразно вычислять среднее, медиану и т.д., строить гистограммы, боксплоты и т.д.
  • для логических переменных целесообразным является вычисление среднего значения,3 таблицы частот и столбчатой диаграммы
  • для символьных переменных наиболее подходящими являютсяоблака слов (если только переменную нельзя рассматривать как факторную из-за небольшого количества разных уровней)

Теперь мы проиллюстрируем примеры на R:4

## фактор:table(gender)

## gender## female   male ##      3      2

prop.table(table(gender))

## gender## female   male ##    0.6    0.4

barplot(table(gender))

## количественная непрерывная:x <- rnorm(100)summary(x)

##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. ## -2.99309 -0.74143  0.01809 -0.08570  0.58937  2.70189

par(mfrow = c(1, 2)) ## объединение двух графиковhist(x)boxplot(x)

## логическое:x <- c(TRUE, FALSE, FALSE, TRUE, TRUE)mean(x)

## [1] 0.6

table(x)

## x## FALSE  TRUE ##     2     3

barplot(table(x))

Для заинтересованного читателя см. самые распространенные описательные статистики в R для разных типов данных.

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

Ошибка, связанная с указанной выше, – это непоследовательный тип данных. Увидеть это на практике можно на следующем примере:

x <- c(2.4, 3.7, 5.1, 9.8)class(x)

## [1] "numeric"

y <- c(2.4, 3.7, 5.1, "9.8")class(y)

## [1] "character"

Как видите, вектор x является числовым, в то время как вектор y имеет форму символа. Это связано с тем, что последний элемент y заключен в кавычки (и поэтому рассматривается как строка, а не числовое значение), поэтому весь вектор принимает форму символа.

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

Чтобы избежать этого, хорошей практикой является проверка структуры вашего набора данных (str()) после его импорта, чтобы убедиться, что все ваши переменные имеют желаемый формат. Если нет, вы можете либо исправить значения в исходном файле, либо изменить формат в R (с помощью as.numeric()).

6. Забывание знака + в ggplot2

Если вы только что научились использовать пакет ggplot2 для создания графиков (и я настоятельно рекомендую это!), распространенная ошибка – забыть знак +.

Вы знаете, что график, созданный с помощью ggplot2, строится путем добавления нескольких слоев:

## загрузка пакета:library(ggplot2)## первый слой, набор данных:ggplot(data = diamonds) +  ## второй слой, эстетика:  aes(x = cut, y = price) +  ## третий слой, тип графика:  geom_boxplot() +  ## добавление других слоев:  theme_minimal()

Решение

Для всех ваших графиков с ggplot2 не забудьте добавить знак + после каждого слоя, кроме последнего.

7. Недопонимание между = и ==

Присваивание в R может выполняться тремя способами, от наиболее до наименее распространенных:

  1. <-
  2. =
  3. assign()

Второй метод, то есть =, не следует путать с ==.

Действительно, присваивание объекта (с помощью любого из трех указанных выше методов) используется для сохранения чего-либо в R. Например, если мы хотим сохранить вектор (1, 3, 7) и переименовать этот вектор в x, мы можем написать:

x <- c(1, 3, 7)## или:x = c(1, 3, 7)## или:assign("x", c(1, 3, 7))

При выполнении этого кода вы увидите, что вектор x размером 3 появляется во вкладке “Окружение” (верхняя правая панель, если вы используете стандартное представление RStudio):

Теперь мы можем использовать этот вектор, просто обращаясь к нему по его имени:

x

## [1] 1 3 7

Вообще говоря, вы не можете присвоить объект с помощью ==:

## НЕ корректно, если мы хотим присвоить c(1, 3, 7) к x:x == c(1, 3, 7)

Итак, вы задаете вопрос, когда мы будем использовать ==? Фактически, это используется, когда вы хотите использовать знак равенства.

Я понимаю, что сейчас это может быть абстрактным и запутанным, поэтому давайте предположим следующие два сценария в качестве примеров (которые являются двумя самыми распространенными случаями использования ==):

  1. мы хотим проверить, соответствует ли присвоенный объект или переменная некоторым условиям, и
  2. мы хотим выбрать поднабор фрейма данных на основе одного или нескольких условий.

Для этих примеров предположим выборку из 5 детей:

## create dataframe:dat <- data.frame(  Name = c("Mary", "Linda", "James", "John", "Patricia"),  Age = c(7, 10, 3, 9, 7),  Gender = c("Girl", "Girl", "Boy", "Boy", "Girl"))## print dataframe:dat

##       Name Age Gender## 1     Mary   7   Girl## 2    Linda  10   Girl## 3    James   3    Boy## 4     John   9    Boy## 5 Patricia   7   Girl

Теперь давайте напишем разные куски кода для этих двух сценариев, чтобы проиллюстрировать их:

  • Мы хотим проверить, равна ли переменная Age вектору (1, 2, 3, 4, 5):
dat$Age == 1:5

## [1] FALSE FALSE  TRUE FALSE FALSE

С помощью этого кода мы спрашиваем, равен ли первый элемент переменной Age 1, второй элемент переменной Age равен 2 и так далее. Ответ, конечно же, будет FALSE, FALSE, TRUE, FALSE и FALSE, так как только у третьего ребенка возраст равен 3 годам.

  • Мы хотим узнать, какие из наших 5 выбранных детей являются девочками:
dat$Gender == "Girl"

## [1]  TRUE  TRUE FALSE FALSE  TRUE

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

Если вы напишете любую из этих двух строк:

## this overwrites Age and Gender:dat$Age = 1:5dat$Gender = "Girl"

Вы фактически перезапишете переменные Age и Gender, так что наши 5 детей будут иметь возраст от 1 до 5 (1 год для первого ребенка, до 5 лет для пятого ребенка), и все они будут девочками.

  • Теперь предположим, что мы хотим выбрать поднабор нашего фрейма данных на основе условия, а именно, мы хотим извлечь только детей, которым 7 лет:
subset(dat, Age == 7)

##       Name Age Gender## 1     Mary   7   Girl## 5 Patricia   7   Girl

Если вы не хотите использовать функцию подмножества, вы также можете использовать квадратные скобки:

dat[dat$Age == 7, ]

## Name Age Gender## 1     Мэри   7   Девочка## 5 Патриция   7   Девочка

Как видно из предыдущих примеров, мы не хотим назначать ничего. Вместо этого мы спрашиваем “равна ли эта переменная или вектор чему-то другому?”. Для этой конкретной потребности мы используем ==.

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

8. Выбраны неопределенные столбцы

Если вы привыкли выбирать подмножества данных с помощью квадратных скобок [], вместо функций subset() или filter(), вы могли столкнуться с ошибкой “Error in [.data.frame(…) : выбраны неопределенные столбцы”.

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

Учитывая ту же выборку из 5 детей, которая была представлена ранее, следующий код вызовет ошибку:

dat[dat$Age == 7]

## Error in [.data.frame(dat, dat$Age == 7) : выбраны неопределенные столбцы

потому что он не указывает размерность столбца.

Решение

Помните, что в R у данных две размерности:

  1. строки (по одной для каждого экспериментального блока) и
  2. столбцы (по одному для каждой переменной)

и в именно в этом порядке (сначала строки, затем столбцы)!

Поскольку у данных есть две размерности, R ожидает две размерности, когда вы вызываете dat[].

В частности, он ожидает сначала первую, а затем вторую размерность, разделенные запятой:

dat[dat$Age == 7, ]

## Name Age Gender## 1     Мэри   7   Девочка## 5 Патриция   7   Девочка

Этот код означает, что мы извлекаем все строки, где Age равно 7 (первая размерность, то есть перед запятой), для всех переменных набора данных (поскольку мы не указали никакого столбца после запятой).

Для заинтересованного читателя смотрите другие способы выборки и манипулирования данными в R.

9. Проблема при импорте или использовании неправильного файла данных

Импорт набора данных в R может быть довольно сложным для начинающих, в основном из-за непонимания рабочего каталога.

При импорте файла R не будет искать файл во всех папках вашего компьютера. Вместо этого он будет искать только в одной конкретной папке. Если ваш набор данных не находится в этой папке, возникнет ошибка вроде “cannot open file ‘…’: No such file or directory”:

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

Установку рабочего каталога можно выполнить с помощью функции setwd() или через вкладку “Files” в правой нижней панели RStudio:

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

Еще одна связанная проблема – использование неправильного файла. Эта ошибка отличается от предыдущих тем, что вы не столкнетесь с ошибкой, но ваши анализы все равно будут неверными.

Может показаться тривиальным, но убедитесь, что вы импортируете и используете правильный файл данных! Это особенно важно, если у вас есть файлы для разных моментов времени с общей структурой (например, еженедельные или ежемесячные файлы данных с точно такими же переменными). Мне случалось, что я отчетливо сообщал результаты для неправильной недели (к счастью, без большого последствия).

Также убедитесь, что вы действительно используете все строки, которые хотите включить в анализ. Мне случалось так, что для тестирования модели (и для сокращения времени вычислений) я извлекал случайную выборку из исходного набора данных и почти забывал об этой выборке при выполнении конечного анализа.

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

10. Проблема при использовании оператора $

Что касается последней ошибки из этого топ-10, я хотел бы сосредоточиться на двух связанных ошибках:

  1. “Оператор $ недопустим для атомарных векторов”, и
  2. “Объект типа ‘замыкание’ не может быть субсетом”.

Я объединяю их в одну секцию, потому что они связаны друг с другом в том смысле, что они оба связаны с оператором $.

Оператор $ недопустим для атомарных векторов

Чтобы понять эту ошибку, мы сначала должны вспомнить, что атомарный вектор – это одномерный объект (обычно создаваемый с помощью c()). Это отличается от фреймов данных или матриц, которые являются двумерными (то есть строки образуют первое измерение, а столбцы соответствуют второму измерению).

Ошибка “Оператор $ недопустим для атомарных векторов” возникает, когда мы пытаемся получить доступ к элементу атомарного вектора с помощью оператора доллара ($):

## определение атомарного вектора:x <- c(1, 3, 7)## установка имен:names(x) <- LETTERS[1:3]## печать вектора:x

## A B C ## 1 3 7

## доступ к значению элемента C:x$C

## Ошибка в x $ C: оператор $ недопустим для атомарных векторов

Решение

Оператор $ нельзя использовать для извлечения элементов из атомарных векторов. Вместо этого мы должны использовать двойные квадратные скобки [[]]:

x[["C"]]

## [1] 7

Помните, что оператор $ можно использовать с фреймами данных, поэтому мы также можем исправить эту ошибку, сначала преобразовав атомарный вектор в фрейм данных5 и затем получив доступ к элементу по его имени с помощью оператора $:

## преобразование атомарного вектора в фрейм данных:x <- as.data.frame(t(x))## печать x:x

##   A B C## 1 1 3 7

## доступ к значению элемента C:x$C

## [1] 7

Объект типа ‘замыкание’ не может быть субсетом

Другая ошибка (которую, должен признать, весьма неясно и запутано, когда учишь R) выглядит следующим образом: “Объект типа ‘замыкание’ не может быть субсетом”.

Эта ошибка возникает, когда мы пытаемся выбрать или получить доступ к некоторым элементам функции. Пример с известной функцией mean():

mean[1:3]

## Ошибка в mean[1:3] : объект типа 'замыкание' не может быть субсетом

В R мы можем взять подмножество списков, векторов, матриц, фреймов данных, но не функций. Таким образом, ошибка возникает, потому что невозможно создать подмножество объекта типа “замыкание”, а функция имеет этот тип:

typeof(mean)

## [1] "замыкание"

Большинство времени вы не столкнетесь с этой ошибкой при использовании базовой функции, например функции mean() (потому что вряд ли вашей целью является создание подмножества функции…).

На самом деле, вы скорее всего столкнетесь с этой ошибкой, когда попытаетесь создать подмножество набора данных с именем data, но этот набор данных не определен в среде (например, потому что он не был импортирован или создан должным образом).

Чтобы понять концепцию, рассмотрим следующие примеры:

## создаем набор данных:data <- data.frame(  x = rnorm(10),  y = rnorm(10))## выводим переменную x:data$x

##  [1]  1.12288964  1.43985574 -1.09711377 -0.11731956  1.20149840 -0.46972958##  [7] -0.05246948 -0.08610730 -0.88767902 -0.44468400

Пока все хорошо. Теперь предположим, что мы совершили ошибку при создании набора данных:

## создаем набор данных (с ошибкой):data <- data.frame(x = rnorm(10)                   y = rnorm(10))

Вы заметите, что между переменными x и y отсутствует запятая. В результате набор данных с именем data не создается и, следовательно, не определен.

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

data$x

## Error in data$x : object of type 'closure' is not subsettable

Это происходит потому, что, повторюсь, набор данных data не существует, поэтому R ищет объект с именем data и находит функцию с таким именем:

class(data)

## [1] "function"

Предупреждения

Предупреждения отличаются от ошибок в том смысле, что они предупреждают вас о чем-то, но не мешают выполнению кода. Рекомендуется прочитать эти предупреждения, так как они могут содержать полезную информацию.

Их слишком много, чтобы упоминать их все, но я хотел бы сосредоточиться на двух часто встречающихся:

  1. «NAs introduced by coercion» и
  2. «Removed … rows containing non-finite values (stat_bin())».

«NAs introduced by coercion»

Это предупреждение возникает, когда вы пытаетесь преобразовать вектор, включающий хотя бы одно нечисловое значение, в числовой вектор:

x <- c(1, 3, 7, "Emma")as.numeric(x)

## Warning: NAs introduced by coercion

## [1]  1  3  7 NA

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

«Removed … rows containing non-finite values (stat_bin())»

Это предупреждение возникает при использовании ggplot2 для построения графиков. Например:

ggplot(airquality) +  aes(x = Ozone) +  geom_histogram()

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

## Warning: Removed 37 rows containing non-finite values (`stat_bin()`).

Опять же, поскольку это предупреждение, вам не нужно исправлять его. Оно просто информирует о том, что в переменной интереса есть некоторые отсутствующие значения (NA), и эти отсутствующие значения удаляются для построения графика.

Заключение

Спасибо за чтение.

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

Если вы все еще не можете исправить свою ошибку, я рекомендую прочитать документацию функции (если у вас возникли трудности с определенной функцией) или поискать решение в интернете. Имейте в виду, что если вы столкнулись с ошибкой, очень вероятно, что кто-то уже опубликовал ответ в интернете (Stack Overflow обычно хороший ресурс).

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

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

Статья первоначально опубликована здесь Антуаном Сотеваем.