我试图在运行lapply时将元素名称放在图形的标题中。问题是名称不是迭代,只是在所有图中都显示了第一个名称。
数据示例和代码:
if(!require(scatterplot3d)) {
install.packages("scatterplot3d"); require(scatterplot3d)}
head(palha_antes)
X.mm Y.mm Altura.mm Rugosidade.mm
1 0 0 198.421 24.677
2 20 0 189.377 33.721
3 40 0 199.212 23.886
4 60 0 196.857 26.241
5 80 0 193.048 30.050
6 100 0 204.922 18.176
tratamentos = list(palha_antes, palha_depois, exposto_antes, exposto_depois)
names = c("Tratamento com palha antes da chuva",
"Tratamento com palha depois da chuva",
"Tratamento sem palha antes da chuva",
"Tratamento sem palha depois da chuva")
names(tratamentos) <- names
par(mfrow = c(2,2))
lapply(tratamentos, function (x) {
scatterplot3d(as.numeric(unlist(x[1])), as.numeric(unlist(x[2])),
as.numeric(unlist(x[3])), xlab = "X (mm)",ylab = "Y (mm)",
main = lapply(names(tratamentos), function(y) y), zlab = "Altura (mm)", pch = 20)
})
par(mfrow = c(1,1))
部分main = lapply(names(tratamentos), function(y) y)
未按预期运行:1
如果我将x作为y main = lapply(names(tratamentos), function(y) x)
的函数,则绘图将获取变量x的所有值,而不是名称。那么,您有什么建议来解决这部分代码吗?谢谢。
答案 0 :(得分:0)
为什么你需要2 lapply
?以下作品。
tratamentos = list(palha_antes, palha_depois, exposto_antes, exposto_depois)
## don't use "names"; that will mask function "names"
NAMES <- c("Tratamento com palha antes da chuva",
"Tratamento com palha depois da chuva",
"Tratamento sem palha antes da chuva",
"Tratamento sem palha depois da chuva")
par(mfrow = c(2,2))
lapply(1:length(tratamentos), function (i) {
scatterplot3d(tratamentos[[i]][[1]], tratamentos[[i]][[2]],
tratamentos[[i]][[3]], xlab = "X (mm)", ylab = "Y (mm)",
main = NAMES[i], zlab = "Altura (mm)", pch = 20)
})
par(mfrow = c(1,1))
基本上没有必要使用lapply
。 for
循环是完美的:
par(mfrow = c(2,2))
for (i in 1:length(tratamentos)) {
scatterplot3d(tratamentos[[i]][[1]], tratamentos[[i]][[2]],
tratamentos[[i]][[3]], xlab = "X (mm)", ylab = "Y (mm)",
main = NAMES[i], zlab = "Altura (mm)", pch = 20)
}
par(mfrow = c(1,1))
可重复的示例
set.seed(0)
d <- data.frame(x = rnorm(50), y = rnorm(50), z = rnorm(50))
lst <- list(d, d, d, d)
NAMES <- LETTERS[1:4]
## `for` loop
par(mfrow = c(2,2))
for (i in 1:length(lst)) {
scatterplot3d(lst[[i]][[1]], lst[[i]][[2]],
lst[[i]][[3]], xlab = "X (mm)", ylab = "Y (mm)",
main = NAMES[i], zlab = "Altura (mm)", pch = 20)
}
par(mfrow = c(1,1))
## `lapply`
par(mfrow = c(2,2))
lapply(1:length(lst), function (i) {
scatterplot3d(lst[[i]][[1]], lst[[i]][[2]],
lst[[i]][[3]], xlab = "X (mm)", ylab = "Y (mm)",
main = NAMES[i], zlab = "Altura (mm)", pch = 20)
})
par(mfrow = c(1,1))
注意,scatterplot3d
已返回值,因此如果您使用lapply
,则会在屏幕上看到一个长列表。
对您的代码的评论
x[[1]]
代替unlist(x[1])
;我也不知道额外的as.numeric
是什么; lapply(names(tratamentos), function(y) y)
只是as.list(names(tratamentos))
。