使用 mapply 绘图

Using mapply to plot

我正在尝试仅使用 mapply 迭代绘制散点图。 假设我有 iris 数据集:

> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length"
[4] "Petal.Width"  "Species" 

我想使用 mapply() 且仅使用 mapply() 来绘制 Sepal.WidthPetal.LengthPetal.WidthSepal.Length

我有这个起始代码:

    mapply(function(ii){plot(x = iris[["Sepal.Length"]],
           y = ii, ylab = paste(names(ii)), xlab = "Sepal Length")},
           ii = iris[c(2,3,4)])

这里一切正常,除了 y 轴标签。我想让它显示 y 轴值的列名,但这不起作用。

mapplylapply 都没有将其数据对象中的项目名称传递给 "working functions"。您在函数完成后看到的是它们将名称添加回结果。即使您使用 deparse(substitute)) 策略,您最终也会得到一个无用的名称,例如 "dots[[1L]][[1L]]"。因此,您只能通过名称本身或通过 names(dataframe) 值的数字索引进行索引。

考虑传递列名称以满足您的列分配和 ylab 字符要求。正如@alistaire 评论的那样,您只将一个向量传递到您的函数中。 Mapply(非正式地称为 m多变量 apply)旨在逐元素迭代多个 equal-length 或 multiple-length 向量。这类似于传递 Sepal.Length 1 或 3 次:

plotfct <- function(ii, jj)
  plot(x = iris[[ii]], y = iris[[jj]], 
       xlab = paste(ii), ylab = paste(ii))

mapply(plotfct, c("Sepal.Length", "Sepal.Length", "Sepal.Length"), 
                c("Sepal.Width", "Petal.Length", "Petal.Width"))

但是由于Sepal.Length没有变化,重复它的值以满足更长的长度是多余的。只需使用 lapply 或其简化的包装器 sapply:

plotfct <- function(ii)
  plot(x = iris[["Sepal.Length"]], y = iris[[ii]], 
       xlab = "Sepal Length", ylab = paste(ii))

lapply(c("Sepal.Width", "Petal.Length", "Petal.Width"), plotfct)

# EQUIVALENTLY:
# sapply(c("Sepal.Width", "Petal.Length", "Petal.Width"), plotfct)