qplot没有懒惰的x和y评估

时间:2014-12-06 13:03:15

标签: r ggplot2 lazy-evaluation r-grid

举个例子:

require(ggplot2)
require(gridExtra)

data(diamonds)
name <- c("x","y","z")
l <- list()
j <- 1

for (i in 1:(length(name)-1)){
  for (k in (i+1):length(name)){
    l[[j]] <- qplot(diamonds[,name[i]], diamonds[,name[k]]) + 
      labs(x = name[i], y = name[k])
    j <- j + 1
  }
}

do.call(grid.arrange, l)

它打印相同情节的3倍: enter image description here

我认为这是因为qplot不会立即评估 x y

> l[[1]]$mapping
List of 2
 $ x: language diamonds[, name[i]]
 $ y: language diamonds[, name[k]]

那么如何让它立即评估name[i]

解决方法是:

for (i in 1:(length(name)-1)){
  for (k in (i+1):length(name)){
    l[[j]] <- ggplot(diamonds, aes_string(x=name[i], y=name[k])) +
      geom_point()
    j <- j + 1
  }
}

但是完整的数据集保存在list-elements中:

> str(l[[1]]$data)
'data.frame':   53940 obs. of  10 variables:
 $ carat  : num  0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
 $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
 $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
 $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
 $ depth  : num  61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
 $ table  : num  55 61 65 58 58 57 57 55 61 61 ...
 $ price  : int  326 326 327 334 335 336 336 337 337 338 ...
 $ x      : num  3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
 $ y      : num  3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
 $ z      : num  2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...

1 个答案:

答案 0 :(得分:4)

你的&#34;解决方法&#34;在我看来是正确的方法。 qplot是一个便利功能,我觉得完全没必要,也从不使用。但是,问题与qplot创建数据框架有关,如果您不提供数据框架,则可以使用以下解决方法:

require(ggplot2)
require(gridExtra)

data(diamonds)
name <- c("x","y","z")
l <- list()
j <- 1

for (i in 1:(length(name)-1)){
  for (k in (i+1):length(name)){
    l[[j]] <- qplot(x, y, data = data.frame(x = diamonds[,name[i]], 
                                            y = diamonds[,name[k]])) + 
      labs(x = name[i], y = name[k])
    j <- j + 1
  }
}

do.call(grid.arrange, l)

enter image description here