1

我最近熟悉了这个rstatix包。下面是使用此包中的函数的示例代码。

library(tidyverse)
library(rstatix)
library(ggpubr)

set.seed(1111)
n=100
df = tibble(
  x1 = rnorm(n, 0, 1.1),
  x2 = rnorm(n, 0.2, .1),
  x3 = rnorm(n, -.2, .2),
  x4 = rnorm(n, 0, 2),
) %>% pivot_longer(x1:x4)
df

pwc = df %>%
  pairwise_t_test(value~name, paired = TRUE,
                  p.adjust.method = "bonferroni") %>%
  add_xy_position(x = "name") %>%
  mutate(name=group1,
         lab = paste(p, " - ", p.adj.signif))
res.test = df %>% anova_test(value~name)

df %>% ggplot(aes(name, value))+
  geom_boxplot(alpha=0.6)+
  stat_pvalue_manual(pwc, step.increase=0.05, label = "lab")+
  labs(title = get_test_label(res.test, detailed = TRUE),
       subtitle = get_pwc_label(pwc))

但是,我注意到函数喜欢get_test_labelget_pwc_label不返回文本,而是准备文本的命令。

例如,调用get_test_label(res.test, detailed = TRUE)给出了这个:

paste("Anova, ", italic("F"), "(3,396)", " = ", 
    "5.26, ", italic("p"), " = ", "0.001", 
    paste(", ", eta["g"]^2, " = ", 0.04), "")

反过来,调用get_pwc_label(pwc)将导致:

paste("pwc: ", bold(c(t_test = "T test")), "; p.adjust: ", 
    bold("Bonferroni"))

现在我的问题,基本上是两个问题。

  1. 这些函数不返回文本而是返回命令的原因可能是什么?
  2. 如何制作自己的返回类似命令的函数。
4

1 回答 1

2

R 的图形设备使用定义的语法?plotmath来区分文字和格式化文本。这种语法的一个基本特征是字符串定义文字文本,而函数定义对文本的操作,例如并列和格式化(更改字体、添加变音符号、在数学公式中正确使用空格等)。那么,您所看到的是定义格式化文本的函数和字符串的未评估组合。这些通常称为plotmath表达式。

我可以为您提供一个基本示例,展示不同的表达式如何转换为图形输出,但是 R 中内置了一个出色的演示:只需demo("plotmath")在交互式 R 会话中运行并按照提示操作即可。

可用于创建与您所看到的表达式类似的函数包括quotesubstitutebquotestr2lang. 您可能会使用其中之一来格式化,例如,情节标题。下面是我将如何使用每个函数来生成表达式paste("Michaelis constant: ", italic("K")["M"], " = ", 0.015)

quote(
  paste("Michaelis constant: ", italic("K")["M"], " = ", 0.015)
)

substitute(
  paste("Michaelis constant: ", italic(sym)[sub], " = ", val),
  list(sym = "K", sub = "M", val = 0.015)
)

sym <- "K"
sub <- "M"
val <- 0.015
bquote(
  paste("Michaelis constant: ", italic(.(sym))[.(sub)], " = ", .(val))
)

str2lang(
  'paste("Michaelis constant: ", italic("K")["M"], " = ", 0.015)'
)

差异是微妙的,因此值得浏览每个函数的帮助页面并在那里运行示例。

可用于创建表达式向量的函数包括expressionstr2expression。您将使用其中之一来一次格式化一个或多个标签,例如,在定义轴刻度标签时。以下是我如何使用每个函数以 10 的递增幂来格式化刻度标签:

expression(10^0, 10^1, 10^2, 10^3, 10^4, 10^5)
str2expression(paste0(10, "^", 0:5))

最后,这是一个将所有内容放在一起的有趣情节:

plot.new()
plot.window(c(0, 1), c(1, 100000), log = "y")
box()
title(main = quote(paste("Michaelis constant: ", italic("K")["M"], " = ", 0.015)))
axis(side = 2, at = 10^(0:5), labels = str2expression(paste0(10, "^", 0:5)), las = 1)
text(x = seq(0, 1, by = 0.2), y = 10^(0:5), labels = str2expression(sprintf('%s("%s")', c("plain", "bold", "italic", "bolditalic", "symbol", "underline"), month.abb[1:6])))

有关更多示例,请查看?plotmath.

于 2021-11-15T09:45:01.940 回答