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

Введение

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

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

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

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

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

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

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

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

## missing a closing parenthesis:
mean(c(1, 7, 13)
     
## missing a curly brace before "else":
x <- 7 
if(x > 10) {
  print("x > 10")
 else {
  print("x <= 10")
 }
  
## missing a square bracket:
summary(ggplot2::diamonds[, "price")
## missing a closing quote in 2nd element:
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 закрывающая скобка, фигурная скобка, квадратная скобка или кавычка будут автоматически написаны при открытии.

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

## NOT correct:
install.packages(ggplot2)
## Error in install.packages : object 'ggplot2' not found
## correct:
install.packages("ggplot2")
## also correct:
install.packages("ggplot2")

Решение

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

mean(c(1, 7, 13))
## [1] 7
x <- 7
if (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("Group 1", "Group 2")
grp
## [1] "Group 1" "Group 2"

Также убедитесь:

  • правильно расставить запятые:
## NOT correct (misplaced comma):
c("Group 1," "Group 2")
## Error: unexpected string constant in "c("Group 1," "Group 2""
## also NOT correct (missing comma):
c("Group 1" "Group 2")
## Error: unexpected string constant in "c("Group 1" "Group 2""
## correct:
c("Group 1", "Group 2")
  • вы не смешиваете одинарные и двойные кавычки для одного и того же элемента:
## NOT correct:
c("Group 1')
## correct:
c("Group 1")
## also correct:
c('Group 1')

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

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

Если вы столкнулись со следующей ошибкой: «Ошибка в …: не удалось найти функцию «…»», например:

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

Решение

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

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

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

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

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

## typo in function name:
maen(c(1, 7, 13))
## Error in maen(c(1, 7, 13)) : could not find function "maen"
## typo in variable name:
summary(ggplot2::diamonds[, "detph"])
## Error: Column `detph` doesn't exist
## typo in dataset name:
data <- data.frame(
  x = rnorm(10),
  y = rnorm(10)
)
summary(dta[, 2])
## Error in summary(dta[, 2]) : object 'dta' not found
## typo in object name:
test <- c(1, 7, 13)
mean(tset)
## Error in mean(tset) : object 'tset' not found
## typo in package name:
library("tydiverse")
## Error in library("tydiverse") : there is no package called ‘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)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0      ✔ purrr   0.3.5 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.3      ✔ forcats 0.5.2 
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()

Если вы уверены, что правильно написали объект, функцию или набор данных, но у вас по-прежнему возникает ошибка о том, что «объект '…' не найден», убедитесь, что вы определили свой объект/функцию/набор данных before вызываю!

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

Помните, что написание кода в сценарии 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, которое можно указать в дополнение к количеству наблюдений n (вместо дисперсии 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

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

?rnorm()
## or:
help(rnorm)

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

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

  • Числовой
  • Характер
  • Фактор
  • Логический

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

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

gender <- factor(c("female", "female", "male", "female", "male"))
mean(gender)
## Warning in mean.default(gender): argument is not numeric or logical: returning
## NA
## [1] NA

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

barplot(table(rnorm(10)))

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

Решение

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

Например:

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

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

## factor:
table(gender)
## gender
## female   male 
##      3      2
prop.table(table(gender))
## gender
## female   male 
##    0.6    0.4
barplot(table(gender))

## quantitative continuous:
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)) ## combine two plots
hist(x)
boxplot(x)

## logical:
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, создается путем добавления нескольких слоев:

## load package:
library(ggplot2)
## first layer, the dataset:
ggplot(data = diamonds) +
  ## second layer, the aesthetics:
  aes(x = cut, y = price) +
  ## third layer, the type of plot:
  geom_boxplot() +
  ## add more layers:
  theme_minimal()

Решение

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

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

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

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

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

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

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

При выполнении этого фрагмента кода вы увидите, что вектор x размера 3 появляется на вкладке «Среда» (верхняя правая панель, если вы используете представление RStudio по умолчанию):

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

x
## [1] 1 3 7

Ни в коем случае нельзя назначать объект с ==:

## NOT correct if we want to assign c(1, 3, 7) to 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:5
dat$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     Mary   7   Girl
## 5 Patricia   7   Girl

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

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

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

Если вы привыкли использовать подмножество фреймов данных с квадратными скобками, [], вместо функций subset() или filter(), возможно, вы столкнулись с ошибкой «Ошибка в [.data.frame(…) : выбраны неопределенные столбцы».

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

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

dat[dat$Age == 7]
## Error in `[.data.frame`(dat, dat$Age == 7) : undefined columns selected

потому что он не определяет измерение столбца.

Решение

Помните, что кадры данных в R имеют два измерения:

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

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

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

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

dat[dat$Age == 7, ]
##       Name Age Gender
## 1     Mary   7   Girl
## 5 Patricia   7   Girl

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

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

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

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

При импорте файла R не будет искать файл во всех папках на вашем компьютере. Вместо этого он будет искать только в одной конкретной папке. Если ваш набор данных не находится в этой папке, это приведет к ошибке, такой как «невозможно открыть файл«…»: нет такого файла или каталога»:

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

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

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

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

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

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

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

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

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

  1. «Оператор $ недействителен для атомарных векторов» и
  2. «объект типа «замыкание» не является подмножеством».

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

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

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

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

## define atomic vector:
x <- c(1, 3, 7)
## set names:
names(x) <- LETTERS[1:3]
## print vector:
x
## A B C 
## 1 3 7
## access value of element C:
x$C
## Error in x$C : $ operator is invalid for atomic vectors

Решение

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

x[["C"]]
## [1] 7

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

## convert atomic vector to dataframe:
x <- as.data.frame(t(x))
## print x:
x
##   A B C
## 1 1 3 7
## access value of element C:
x$C
## [1] 7

объект типа «замыкание» не является подмножеством

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

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

mean[1:3]
## Error in mean[1:3] : object of type 'closure' is not subsettable

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

typeof(mean)
## [1] "closure"

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

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

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

## create dataset:
data <- data.frame(
  x = rnorm(10),
  y = rnorm(10)
)
## print variable 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

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

## create dataset (with mistake):
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. «НА, введенные по принуждению», и
  2. «Удалены… строки, содержащие неконечные значения (stat_bin())».

НС, введенные по принуждению

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

x <- c(1, 3, 7, "Emma")
as.numeric(x)
## Warning: NAs introduced by coercion
## [1]  1  3  7 NA

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

Удалены … строки, содержащие неконечные значения (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 крутая кривая обучения, особенно если вы не знакомы с другим языком программирования. Тем не менее, с практикой и временем вы будете делать все меньше и меньше ошибок кодирования, но, что более важно, вы будете все лучше и лучше набирать правильные ключевые слова в поисковых системах, что приведет к тому, что вы будете тратить меньше времени на поиск решения.

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

  1. В этом фрагменте кода есть 2 ошибки, попробуйте исправить их в качестве упражнения. ↩︎
  2. И я настоятельно рекомендую использовать RStudio, а не только R. Отличия смотрите здесь. ↩︎
  3. Обратите внимание, что mean(), примененное к логической переменной, дает пропорцию TRUE.↩︎
  4. par(mfrow = c(1, 2)) используется для размещения двух участков рядом друг с другом. ↩︎
  5. Обратите внимание, что нам также нужно транспонировать вектор x, чтобы он состоял из 1 строки и 3 столбцов. ↩︎

Статьи по Теме

Первоначально опубликовано на https://statsandr.com 7 февраля 2023 г.