#r #dplyr #pipe
#r #dplyr #канал
Вопрос:
[Отказ от ответственности: подобные вопросы задавались много раз. Я не верю, что это то же самое, что и многие темы, которые я только что прочитал.]
Я сделал:
library(dplyr)
colnames(LarvalSamples) %<>%
stringr::str_remove_all("_log") %>%
stringr::str_replace_all("Sea_Level", "Sea_Level_Height") %>% #sealevel, sealion, chinook, chl
stringr::str_replace_all("SeaLion", "Sea_lion") %>%
stringr::str_replace_all("Chinook_Salmon", "Salmon") %>%
stringr::str_replace_all("Chlorophyll_a", "Chlorophyll_A")
Работал нормально, сообщений нет, выводится так, как ожидалось / желалось. Затем я скопировал / вставил эти первые две строки, за исключением канала терминала:
colnames(LarvalSamples) %<>%
stringr::str_remove_all("_log")
Ошибка в именах столбцов (LarvalSamples) %<>% stringr::str_remove_all(«_log»)
: не удалось найти функцию «%<>%»
Я понимаю, что здесь есть другие сообщения о том, что функции не найдены, но dplyr
загружено И проработано больше кода всего двумя строками выше. Так получилось, что в "_log"
шаблонах нет colnames
шаблонов, но я попробовал другой шаблон символов, который существует, и это не дало того же результата, так что один потенциальный источник ошибки устранен. Приветствуются любые мысли / догадки, это больше похоже на ошибку, чем на вопрос tbh, но было бы неплохо взглянуть на нее внимательнее, прежде чем поднимать ее вверх по цепочке, если это необходимо. Спасибо.
> sessionInfo()
R version 3.5.0 (2018-04-23)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17134)
Matrix products: default
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_0.8.0.1 beepr_1.3 gbm.auto_1.2.0
loaded via a namespace (and not attached):
[1] Rcpp_1.0.0 compiler_3.5.0 pillar_1.3.1 shapefiles_0.7 tools_3.5.0 tibble_2.0.1
[7] gtable_0.2.0 lattice_0.20-35 pkgconfig_2.0.2 rlang_0.3.1 Matrix_1.2-14 DBI_1.0.0
[13] rstudioapi_0.9.0 rgdal_1.4-2 gbm_2.1.5 dismo_1.1-4 gridExtra_2.3 stringr_1.4.0
[19] raster_2.8-19 mapplots_1.5.1 rgeos_0.4-2 grid_3.5.0 tidyselect_0.2.5 glue_1.3.0
[25] R6_2.4.0 survival_2.41-3 foreign_0.8-70 sp_1.3-1 purrr_0.3.1 magrittr_1.5
[31] codetools_0.2-15 splines_3.5.0 maptools_0.9-5 assertthat_0.2.0 stringi_1.3.1 crayon_1.3.4
[37] audio_0.1-5.1
Обновление: Воспроизводимый пример ниже. Это определенно похоже на ошибку. С полностью новой системой:
Data <- data.frame(
Name_Bad = sample(1:10),
Name_Guud = sample(1:10)
)
colnames(Data) %<>%
stringr::str_remove_all("_Bad") %>%
stringr::str_replace_all("Guud", "Good")
# Error: could not find function "%>%"
install.packages("dplyr")
library(dplyr)
install.packages("stringr")
library(stringr)
colnames(Data) %<>%
stringr::str_remove_all("_Bad") %>%
stringr::str_replace_all("Guud", "Good")
# no error, worked
colnames(Data) %<>%
stringr::str_remove_all("_Bad")
# Error: could not find function "%<>%"
Ответ №1:
%<>%
не экспортируется dplyr (только %>%
есть). Вместо этого вам нужно загрузить magrittr.
В вашем воспроизводимом примере обнаружена небольшая ошибка magrittr, которая приводит к тому, что при вычислении выражений конвейера выполняется поиск некоторых операторов в области magrittr, а не в области вызова. Таким образом, x %<>% y %>% z
, который вычисляется как `%>%`(x %<>% y, z)
, находит и оценивает `%<>%`
оператор magrittr.
Комментарии:
1. Спасибо; принято в качестве ответа, но основная особенность / неинтуитивное поведение остается: почему это сработало в более длинном конвейере, но не для одной команды? Если бы при первом вызове произошел сбой, я бы знал, что нужно копать глубже…
2. @dez93_2000 Это никогда не работало в более длинном конвейере для кода, который вы показали (вы можете легко убедиться в этом, выполнив эту команду снова). Вместо этого, когда вы выполняли более длинный код, вы (по какой-то причине) ранее загрузили magrittr в активный сеанс.
3. Конрад, я могу обещать тебе на 100%, что это действительно сработало для более длинного кода, и что я ничего не изменил (с точки зрения загрузки / выгрузки пакетов) между двумя исполнениями строк кода. Ни разу до вашего ответа я явно не загружал magrittr. Я должен попытаться отправить статью сегодня, но как только я выполню этот основной прогон моделирования, я попытаюсь вернуться к этому и сделать аккуратный воспроизводимый пример. Еще раз спасибо за вашу помощь.
4. Конрад, еще раз привет, добавлен воспроизводимый пример, похоже, это ошибка.
5. @dez93_2000 Потрясающе, спасибо за вашу настойчивость. Вы правы, это чудовищная ошибка из-за того, как
%>%
использует свои аргументы для оценки. Я отредактирую свой ответ, чтобы объяснить, почему. Возможно, также стоит сообщить об этой ошибке, хотя я сомневаюсь, что она будет исправлена.
Ответ №2:
Команда %>%View()
, препятствующая последующему выполнению команды.
У меня была та же проблема с тем же сообщением об ошибке. Даже если я установил dplyr
библиотеку, появилось сообщение. Я не проверял конфликт между пакетом с помощью одноименной команды.
Я заметил, что в моем коде был data.frame, df1
использующий оператор pipe, за которым следовала команда View()
, затем тот же data.frame df1
использовался при вызове другого data.frame df2
, поэтому было невозможно выполнить df2
data.frame из-за %>%View()
команды.
Сценарий ошибки:
df1%>%
filter(var1='X')%>%
View()
df2<-df1%>%
mutate(var2=var1*2)
Скрипт свободен-ошибка:
df1%>%
filter(var1='X')
df2<-df1%>%
mutate(var2=var1*2)
Что я замечаю, так это то, что из-за View()
команды в df1
она не выдает исполняемый результат в df2
.