TL; DR Поскольку ваш код вообще не использует dplyr::if_else
.
sparklyr
, при использовании в качестве примера рассматривает Spark как еще одну базу данных и выдает проблемызапросы, использующие dbplyr
уровень перевода SQL .
В этом контексте if_else
не рассматривается как функция, но идентификатор, который преобразуется в примитивы SQL:
dbplyr::translate_sql(if_else(PaymentHistory < 0, 0,if_else(PaymentHistory > 1,1, PaymentHistory)))
# <SQL> CASE WHEN ("PaymentHistory" < 0.0) THEN (0.0) WHEN NOT("PaymentHistory" < 0.0) THEN (CASE WHEN ("PaymentHistory" > 1.0) THEN (1.0) WHEN NOT("PaymentHistory" > 1.0) THEN ("PaymentHistory") END) END
Однако, если вы передадите полностью определенное имя, он обойдет этот механизм, попытается оценить функцию и в конечном итоге потерпит неудачу, поскольку столбцы базы данных не находятся в области действия.
Ябоится, что имя в dplyr будет конфликтовать с некоторым из определенного пользователем кода.
Как видите, dplyr вообще не нужен, чтобы быть здесь в области видимости - функции, вызываемые в sparklyr
конвейеры либо переводятся в соответствующие конструкции SQL, либо, если нет определенного правила преобразования, передаются как есть и разрешаются механизмом SQL Spark (этот путь используется для вызова функций Spark ).
КонечноПо сути, этот механизм не является специфичным для sparklyr
, и вы, вероятно, увидите такое же поведение, используя другие таблицы, поддерживаемые базой данных:
library(magrittr)
db <- dplyr::src_sqlite(":memory:", TRUE)
dplyr::copy_to(db, mtcars)
db %>% dplyr::tbl("mtcars") %>% dplyr::mutate(dplyr::if_else(mpg < 20, 1, 0))
Error in dplyr::if_else(mpg < 20, 1, 0) : object 'mpg' not found