В этом посте я расскажу о 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 можно выполнить тремя способами, от наиболее распространенного до наименее распространенного:
<-
=
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)
Итак, вам интересно, когда нам нужно использовать ==
? На самом деле, он используется, когда вы хотите использовать знак равенства.
Я понимаю, что на данный момент это может показаться абстрактным и запутанным, поэтому давайте предположим в качестве примеров следующие два сценария (которые являются двумя наиболее распространенными случаями, когда мы используем ==
):
- мы хотим проверить, соответствует ли назначенный объект или переменная некоторым условиям, и
- мы хотим создать подмножество фрейма данных на основе одного или нескольких условий.
Для этих примеров предположим выборку из 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 имеют два измерения:
- ряды (по одному на каждую экспериментальную единицу) и
- столбцы (по одному для каждой переменной)
и в этом конкретном порядке (сначала строка, затем столбец)!
Поскольку кадры данных имеют два измерения, 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, я хотел бы сосредоточиться на двух связанных ошибках:
- «Оператор $ недействителен для атомарных векторов» и
- «объект типа «замыкание» не является подмножеством».
Я собрал их в один раздел, потому что они связаны друг с другом в том смысле, что оба используют оператор $
.
Оператор $ недействителен для атомарных векторов
Чтобы понять эту ошибку, мы должны сначала вспомнить, что атомарный вектор — это одномерный объект (обычно созданный с помощью 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"
Предупреждения
Предупреждения отличаются от ошибок в том смысле, что они предупреждают вас о чем-то, но не мешают вам запускать код. Рекомендуется прочитать эти предупреждения, так как они могут дать вам ценную информацию.
Предупреждений слишком много, чтобы перечислить их все, но я хотел бы остановиться на двух самых распространенных:
- «НА, введенные по принуждению», и
- «Удалены… строки, содержащие неконечные значения (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 крутая кривая обучения, особенно если вы не знакомы с другим языком программирования. Тем не менее, с практикой и временем вы будете делать все меньше и меньше ошибок кодирования, но, что более важно, вы будете все лучше и лучше набирать правильные ключевые слова в поисковых системах, что приведет к тому, что вы будете тратить меньше времени на поиск решения.
Как всегда, если у вас есть вопрос или предложение, связанное с темой, затронутой в этой статье, пожалуйста, добавьте его в качестве комментария, чтобы другие читатели могли извлечь пользу из обсуждения.
- В этом фрагменте кода есть 2 ошибки, попробуйте исправить их в качестве упражнения. ↩︎
- И я настоятельно рекомендую использовать RStudio, а не только R. Отличия смотрите здесь. ↩︎
- Обратите внимание, что
mean()
, примененное к логической переменной, дает пропорциюTRUE
.↩︎ par(mfrow = c(1, 2))
используется для размещения двух участков рядом друг с другом. ↩︎- Обратите внимание, что нам также нужно транспонировать вектор
x
, чтобы он состоял из 1 строки и 3 столбцов. ↩︎
Статьи по Теме
- Дополнения для RStudio, или как облегчить себе жизнь программиста?
- Как быть в курсе последних новостей R?
- Одновыборочный критерий Уилкоксона в R
- Проверка гипотез вручную
- АНОВА в R
Первоначально опубликовано на https://statsandr.com 7 февраля 2023 г.