【问题标题】:How do I pass variable titles into a ggplot function with lapply? [duplicate]如何使用 lapply 将变量标题传递给 ggplot 函数? [复制]
【发布时间】:2019-06-02 17:16:57
【问题描述】:

我正在使用 lapply 来加速数据探索。我正在同时为数字变量制作箱线图,我想将变量名称传递到图中。

我已尝试定义名称并通过它。

library(ggplot2)
library(mass)
data(Boston)

num_vars = which(sapply(Boston, is.numeric))
ggBox <-function(index) {
  X <- index
  X_name <- names(index)
  ggplot(Boston,aes("X",X)) + geom_boxplot() + ggtitle(X_name)
}

lapply(Boston[names(num_vars)],FUN=ggBox)

我已经尝试了不同的变体,它只是传递 X 或一个数值,没有名称。

【问题讨论】:

  • 如果ggBoxxtitle 作为其前两个参数,那么您可以使用Map(func, Boston[names(num_vars)], names(num_vars))。如果没有,那么您需要编写一个快速匿名函数,例如Map(function(x,nm) ggBox(x, title=nm), Boston[names(num_vars)], names(num_vars))

标签: r


【解决方案1】:

lapply() 只能将对象值传递给函数,并且不能包含其名称。

lapply(iris, FUN = names)

$Sepal.Length         $Sepal.Width         $Petal.Length
NULL                  NULL                 NULL

$Petal.Width          $Species
NULL                  NULL

当我将数据框的每一列传递给names() 时,您可以看到每个单元格都是NULL。如果你想同时使用值和名字,你需要设计一个bivariate函数。

我以iris 数据集为例:

ggBox <- function(x, name) {
  ggplot(iris, aes("X", x)) + geom_boxplot() + ggtitle(name)
}

df <- iris[1:4]
name <- names(iris)[1:4]

以下3种方法是等价的:

mapply(FUN = ggBox, df, name, SIMPLIFY = F)

Map(f = ggBox, df, name)

purrr::map2(df, name, ggBox)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2018-11-09
    • 2017-07-08
    • 2019-02-12
    相关资源
    最近更新 更多