2016-10-01 7 views
0

Я пытаюсь поместить имя элемента в заголовок графика при запуске. Проблема в том, что имена не повторяются, только первое имя отображается на всех графиках.lapply: создание нескольких графиков 3D-разброса с разными заголовками

Пример данных и код:

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

Если я ставлю е как функция у main = lapply(names(tratamentos), function(y) x), сюжет получить все значения из переменная x, а не имя. Итак, есть ли у вас предложение решить эту часть кода? Спасибо.

ответ

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, вы увидите длинный список печатается на экране ,

enter image description here


Комментарии код

  • Вы можете использовать x[[1]] вместо unlist(x[1]); Я также не знаю, для чего нужен дополнительный as.numeric;
  • lapply(names(tratamentos), function(y) y) всего лишь as.list(names(tratamentos)).
+0

Вчера я пытался что-то вроде вас и получил много проблем, возможно, из-за отсутствия опыта с циклами. Спасибо, Чжэюань. –

 Смежные вопросы

  • Нет связанных вопросов^_^