使用 mapply 绘图
Using mapply to plot
我正在尝试仅使用 mapply
迭代绘制散点图。
假设我有 iris
数据集:
> names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length"
[4] "Petal.Width" "Species"
我想使用 mapply()
且仅使用 mapply()
来绘制 Sepal.Width
、Petal.Length
和 Petal.Width
与 Sepal.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 轴值的列名,但这不起作用。
mapply
和 lapply
都没有将其数据对象中的项目名称传递给 "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)
我正在尝试仅使用 mapply
迭代绘制散点图。
假设我有 iris
数据集:
> names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length"
[4] "Petal.Width" "Species"
我想使用 mapply()
且仅使用 mapply()
来绘制 Sepal.Width
、Petal.Length
和 Petal.Width
与 Sepal.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 轴值的列名,但这不起作用。
mapply
和 lapply
都没有将其数据对象中的项目名称传递给 "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)