代码之家  ›  专栏  ›  技术社区  ›  Joachim Schork

随机选择主题

  •  5
  • Joachim Schork  · 技术社区  · 5 年前

    我想画一个带有随机主题的情节(事实上,我想画很多情节,每个情节都有不同的主题)。考虑下面的可重复的例子:

    # Exmple data
    df <- data.frame(x = 1:10, y = 1:10)
    
    # Select theme randomly
    random_theme <<- sample(c("theme_gray", "theme_bw", "theme_light", "theme_dark", "theme_minimal", "theme_classic"), 1)
    
    # Draw ggplot
    ggplot(df, aes(x, y)) +
      geom_line() +
      random_theme            # This line does not work
    

    问题:如何随机选择一个主题?

    3 回复  |  直到 5 年前
        1
  •  11
  •   Spacedman    5 年前

    示例来自函数,而不是函数的名称。此外,当从比标量更复杂的任何对象进行采样时,sample返回一个列表,因此需要第一个list元素。如:

    > sample(c(sqrt, sqrt),2)
    [[1]]
    function (x)  .Primitive("sqrt")
    
    [[2]]
    function (x)  .Primitive("sqrt")
    

    因此,获得一个随机主题函数:

    random_theme <- sample(c(theme_gray, theme_bw, theme_light, theme_dark, theme_minimal, theme_classic), 1)[[1]]
    

    ggplot(df, aes(x, y)) +geom_line() + random_theme()
    

    重采样 random_theme 并再次绘图以进行更新。

    <<- 我猜这是因为拼命想让事情成功。。。

        2
  •  6
  •   Fino    5 年前

    你可以这样做 match.fun()

    random_theme = match.fun(sample(c("theme_gray", "theme_bw", "theme_light", "theme_dark", "theme_minimal", "theme_classic"), 1))
    
    ggplot(df, aes(x, y)) +
     geom_line() +
     random_theme()
    
        3
  •  2
  •   patL grad student    5 年前

    干杯 random_theme 是一个 character eval parse 来解析你的主题。

    library(tidyverse)
    
    ggplot(df, aes(x, y)) +
      geom_line() +
      eval(parse(text = paste0(random_theme, "()")))
    

    或者更直接地说:

    ggplot(df, aes(x, y)) +
      geom_line() +
      eval(parse(text = paste0(sample(c("theme_gray",
                                        "theme_bw", 
                                        "theme_light", 
                                        "theme_dark", 
                                        "theme_minimal", 
                                        "theme_classic"), 1)  , "()")))