включение условных элементов в выражение plotmath для подзаголовка ggplot2

Я пытаюсь написать пользовательскую функцию, в которой я хочу отобразить оценку размера эффекта и его доверительные интервалы в подзаголовке графика 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 не найдены в среде.

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

---------------------- постскриптум------------------------- -------------

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

# 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
)

person Indrajeet Patil    schedule 03.12.2018    source источник


Ответы (2)


комбинация цитаты и 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]
        )
      )
}
person user10737199    schedule 03.12.2018

Вот решение для юникода. Я использую 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)
}

введите здесь описание изображения

person Lyngbakr    schedule 03.12.2018
comment
Спасибо. Просто небольшой вопрос, прежде чем я приму этот ответ: будет ли решение Unicode работать в разных операционных системах? Я всегда работаю с Windows машиной, и это работает, но я бы предпочел, чтобы это работало и на других ОС, поскольку мои сотрудники в основном используют unix машины. - person Indrajeet Patil; 03.12.2018
comment
@IndrajeetPatil Думаю, да. Я использую Ubuntu, и все работает нормально. - person Lyngbakr; 03.12.2018
comment
А, я думал, ты на машине с Windows. К сожалению, это не работает в Windows. Вот что вы получаете с кодом: gist.github.com/IndrajeetPatil/ У вас есть какое-то другое решение, не связанное с изменением кодировки символов? - person Indrajeet Patil; 04.12.2018