включение условных элементов в выражение plotmath для субтитров ggplot2 - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь написать пользовательскую функцию, в которой я хочу отобразить оценку размера эффекта и его доверительные интервалы в ggplot2 сюжетном субтитре.Я использую plotmath для правильного отображения греческих букв и других математических символов.

Вот как должны выглядеть два варианта подзаголовка: *

Чтобы достичь этого, я написал простую функцию -

# set up
set.seed(123)
library(tidyverse)
library(cowplot)

# creating a fictional dataframe with effect size estimate and its confidence
# intervals
effsize_df <- tibble::tribble(
  ~estimate, ~conf.low, ~conf.high,
  0.25, 0.10, 0.40
)

# function to prepare subtitle
subtitle_maker <- function(effsize_df, effsize.type) {
  if (effsize.type == "p_eta") {
    # preparing the subtitle
    subtitle <-
      # extracting the elements of the statistical object
      base::substitute(
        expr =
          paste(
            eta["p"]^2,
            " = ",
            effsize,
            ", 95% CI",
            " [",
            LL,
            ", ",
            UL,
            "]",
          ),
        env = base::list(
          effsize = effsize_df$estimate[1],
          LL = effsize_df$conf.low[1],
          UL = effsize_df$conf.high[1]
        )
      )
  } else if (effsize.type == "p_omega") {
    # preparing the subtitle
    subtitle <-
      # extracting the elements of the statistical object
      base::substitute(
        expr =
          paste(
            omega["p"]^2,
            " = ",
            effsize,
            ", 95% CI",
            " [",
            LL,
            ", ",
            UL,
            "]",
          ),
        env = base::list(
          effsize = effsize_df$estimate[1],
          LL = effsize_df$conf.low[1],
          UL = effsize_df$conf.high[1]
        )
      )
  }

  # return the subtitle
  return(subtitle)
}

Обратите внимание, что код для условных операторов отличается только в одной строке: eta["p"]^2 (если это "p_eta") или omega["p"]^2(если это "p_omega"), а остальная часть кода идентична .Я хочу реорганизовать этот код , чтобы избежать повторения.

Я не могу условно назначить eta["p"]^2 и omega["p"]^2 другому объекту в теле функции (скажем, effsize.text <- eta["p"]^2) потому что R будет жаловаться, что объекты eta и omega не найдены в окружающей среде.

Как я могу это сделать?

---------------------- post-script --------------------------------------

Ниже приведен код, использованный для создания комбинированного графика, показанного выше:

# creating and joining two plots (plot is shown above)
cowplot::plot_grid(
  # plot 1
  ggplot(mtcars, aes(x = wt, y = mpg)) + geom_blank() +
    labs(
      subtitle = subtitle_maker(effsize_df, "p_omega"),
      title = "partial omega"
    ),
  # plot 2
  ggplot(mtcars, aes(x = wt, y = mpg)) + geom_blank() +
    labs(
      subtitle = subtitle_maker(effsize_df, "p_eta"),
      title = "partial eta"
    ),
  labels = c("(a)", "(b)"),
  nrow = 1
)

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

комбинация цитаты и bquote может помочь,

subtitle_maker <- function(d, type){

  et <- if(type == 'a') quote(eta) else if(type == 'b') quote(omega)

  bquote(.(et)['p']^2==.(d$x)~", 95% CI ["*.(d$y)*","*.(d$z)*"]")

}

d <- list(x=1,y=2,z=3)
grid::grid.newpage()
grid::grid.text(subtitle_maker(d,"a"), y=0.3)
grid::grid.text(subtitle_maker(d,"b"), y=0.7)

Примечание: или заменить вместо bquote, это просто личное предпочтение

subtitle_maker <- function(effsize_df, effsize.type) {

  effsize.text <- if (effsize.type == "p_eta") quote(eta["p"]) else 
    if (effsize.type == "p_omega") quote(omega["p"])

      base::substitute(
        expr =
          paste(effsize.text^2,
            " = ",
            effsize,
            ", 95% CI",
            " [",
            LL,
            ", ",
            UL,
            "]",
          ),
        env = base::list(effsize.text = effsize.text,
          effsize = effsize_df$estimate[1],
          LL = effsize_df$conf.low[1],
          UL = effsize_df$conf.high[1]
        )
      )
}
0 голосов
/ 03 декабря 2018

Вот решение Unicode.Я использую case_when из dplyr, чтобы облегчить жизнь.

# function to prepare subtitle
subtitle_maker <- function(effsize_df, effsize.type) {
  # preparing the subtitle
  subtitle <-
    # extracting the elements of the statistical object
    base::substitute(
      expr =
        paste(
          effsize_sym["p"]^2,
          " = ",
          effsize,
          ", 95% CI",
          " [",
          LL,
          ", ",
          UL,
          "]",
        ),
      env = base::list(
        effsize = effsize_df$estimate[1],
        LL = effsize_df$conf.low[1],
        UL = effsize_df$conf.high[1],
        effsize_sym = case_when(
          effsize.type == "p_eta" ~ "\U1D702",
          effsize.type == "p_omega" ~ "\U1D714",
          TRUE ~ NA_character_
        )
      )
    )

  # return the subtitle
  return(subtitle)
}

enter image description here

...