Mam dwie funkcje, które chcę owijać razem w funkcji opakowania do użyteczności. Funkcja owijania zawiera zmienną (nazwa kolumny w dataframe), która powinna być przekazana z funkcji owijania do jednej z poddruzji.

Silnie zmniejszony przykład:

Subfunkcja 1: Utwórz dane

datafun <- function() {

    df_data <- data.frame(x = rep(1:20, 3), 
                          y = rnorm(60),
                          ga = sample(c("a", "b"), 30, replace = TRUE),
                          gb = sample(c("x", "y"), 20, replace = TRUE))

    df_data
}

Subfunkcja 2: Pistolet

plotfun <- function(df, gvar) {

    gvar_q = deparse(substitute(gvar))

    g <- ggplot2::ggplot(df, ggplot2::aes_string(x = "x", y = "y", color = gvar_q)) +
        ggplot2::geom_line() +
        directlabels::geom_dl(ggplot2::aes(label = {{gvar}}), method = list("last.points"))

    g
}

Funkcja pakowania

wrapfun <- function(gvar) {

    dat <- datafun()
    plot <- plotfun(df = dat, gvar = {{gvar}})

    plot
}

Testowanie

Korzystanie z dwóch poddakcji bezpośrednio działa bez problemu:

#works
d <- datafun()
plotfun(d, gvar = ga)

Korzystanie z funkcji opakowania prowadzi jednak do błędu

# doesn't work
wrapfun(gvar = ga)
>Error in FUN(X[[i]], ...) : object 'ga' not found

Należy pamiętać, że (o ile rozumiem), directlabels::geom_dl nie akceptuje aes_string jako obejścia. Wydaje się więc nie mogę przekazać gvar jako ciąg do funkcji.

0
Timm S. 15 styczeń 2020, 20:44

1 odpowiedź

Najlepsza odpowiedź

W najnowszych wersjach ggplot nie używasz deparse/substitute lub aes_string. Wykorzystasz nową składnię kwasinotacji wyłącznie. Z tymim tym przykładem powinieneś zrobić tylko

plotfun <- function(df, gvar) {

   ggplot2::ggplot(df, ggplot2::aes(x = x, y = y, color = {{gvar}})) +
     ggplot2::geom_line() +
     directlabels::geom_dl(ggplot2::aes(label = {{gvar}}), method = list("last.points"))

}

Następnie Twoja funkcja będzie działać zarówno bezpośrednio, jak iw {x0}}

1
MrFlick 15 styczeń 2020, 20:24