tl; dr:df %>% arrange(desc(!!sym("b")))
Przede wszystkich standardowych ocenach dplyr
czasowników są przestarzałe, więc zamiast:
library(dplyr)
x <- "b"
df %>% arrange_(x)
jest obecnie zaleca się wpisać:
library(dplyr)
library(rlang)
df %>% arrange(!!sym(x))
lub:
df %>% arrange(UQ(sym(x)))
gdzie sym
, !!
i UQ
pochodzą z rlang
opakowaniu.
Zobacz ?arrange_
, łączy się z tematem pomocy o nazwie Deprecated SE versions of main verbs.
i oferuje kilka szczegółów.
Stamtąd sortowanie malejące łatwo jest dostosować nowe sformułowanie:
df %>% arrange(desc(!!sym(x)))
Ale to działa prawidłowo, a także:
df %>% arrange(desc(.[[x]]))
FYI, aby pracować z arrange_
moglibyśmy zrobić co następuje. Nie są to zalecane metody, ale proces myślenia jest interesujący.
df %>% arrange_(paste0("desc(",x,")"))
które mogą być uproszczone, jeżeli mamy zmienne liczbowe, takie jak w przykładzie OP:
df %>% arrange_(paste0("-",x))
lub korzystając lazyeval::interp
df %>% arrange_(interp(~desc(y),y=as.name(x)))
Albo jak @ Shyam-saladi proponuje:
desc_ <- function(x) lazyeval::interp(~desc(var), var = as.name(x))
# or just
# desc_ <- function(x) paste0("desc(",x,")")
df %>% arrange_(desc_(x))
Może być taki: 'df%>% dplyr :: arrange (dplyr :: desc (df ["b"])) "? Szczerze mówiąc, nie jestem pewien ... – KFB
Musisz użyć interp – hadley
Dzięki za wskazówki i wyniki dupek, ale nadal nie mogę dowiedzieć się, jak korzystać z interp (z pakietu lazyeval?), Aby ten prosty przykład działa. Będę nadal próbował zrozumieć NSE, ale byłoby wspaniale, gdybyś mógł również opublikować rozwiązanie, jeśli nie zajmie ci to zbyt dużo czasu. Wielkie dzięki i tak –