Код в исходном сообщении терпит неудачу, потому что он использует dplyr
внутри функции, но не использует dplyr
функции цитирования . Когда мы запускаем код через отладчик RStudio и останавливаемся на строке 7, мы видим следующее:
dplyr
не отображает аргумент функции в пределах mean(pollutant, na.rm = TRUE)
, как и ожидалось, поэтому строка 9 не работает. Сбой функции mean()
, поскольку аргумент pollutant
отображается как текстовая строка, а не как столбец во фрейме данных polspecdata
.
Один из способов исправить ошибку - настроить строку 9 для явной ссылки на фрейм данных, переданный из предыдущей функции через оператор канала %>%
, используя форму [[
оператора извлечения для использования строки версия аргумента.
polspecdatamean <- polspecdata %>% summarize(mean_pollutant=mean(.data[[pollutant]],na.rm=TRUE))
Наконец, поскольку функция должна возвращать среднее значение в родительскую среду, мы добавляем печать объекта, созданного в строке 9, в конце функции.
polspecdatamean
Поскольку это задание по программированию для курса Университета Джона Хопкинса R Programming на Coursera, я не буду публиковать полный ответ, потому что это нарушает Кодекс Honor Coursera.
Упрощение решения
Как только данные отфильтрованы в строке 5, функция может просто вернуть среднее значение следующим образом.
mean(specdata[[pollutant]],na.rm=TRUE)
Выводы
Для этого конкретного задания использование dplyr
делает назначение более трудным, чем это должно быть из-за того, что dplyr
использует нестандартную оценку и dplyr
даже не рассматривается в учебной программе JHU до третьего курса в последовательности.
В коде есть некоторые другие тонкие недостатки, исправление которых мы оставим в качестве упражнения для читателя. Например, учитывая требования назначения, функция должна иметь возможность обрабатывать следующие входные данные:
pollutantmean("specdata","sulfate",23) # calc mean for sensor 23
pollutantmean("specdata","nitrate",70:72) # calc mean for sensors 70 - 72