8

対話的に、この例は正常に動作します:

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + facet_grid(. ~ vs)

ここで、数式インターフェイスを使用aes_stringして関数を作成し、これと同じことを行うために使用しますが、機能しません (エラー: Error in layout_base(data, cols, drop = drop) : At least one layer must contain all variables used for facetting):

tf <- function(formula, data) {
res <- as.character(formula[[2]])
fac2 <- as.character(formula[[3]][3])
fac1 <- as.character(formula[[3]][2])

# p <- ggplot(aes_string(x = fac1, y = res), data = data)
# p <- p + geom_point() # original attempt
p <- ggplot() # This is Joran's trick, but it doesn't work here
p <- p + geom_point(aes_string(x = fac1, y = res), data = data)
p <- p + facet_grid(.~fac2) # comment this out, and it works but
# of course is not faceted
}

p <- tf(formula = wt ~ am*vs, data = mtcars)

Joran のトリックにより、最近投稿した同様の質問であるhereを参照します。この場合ggplot2、ファセット リクエストが表示されません。作ってfacet_grid(".~fac2")も何の効果もありませんでした。提案?私は常にこれらのことに頭を悩ませています。ありがとう!

4

2 に答える 2

6

あなたは使用することができas.formulaますpaste

p <- p + facet_grid(as.formula(paste(". ~", fac2)))

あなたの例では、これは次のようになります。

ここに画像の説明を入力

于 2013-02-07T02:15:22.063 に答える
6

formula.tools数式の操作に使用しました。

ファセット式については別の議論が必要だと思います。それ以外の場合はwt ~ am*vs、ファセットに関して何を意味するかを理解するために独自のパーサーを作成する必要があります

ラティスのグループ化のアイデアのようなものが役立つかもしれません

wt~am | vs

しかし、それらが式をどのように解析するかを確認するには、格子を掘り下げる必要があります (見てくださいlatticeParseFormula- 複雑です!)

2つの式を分離するだけで簡単です。facet引数の rhs および lhs として文字変数のリストを渡すことができますfacet_grid

私はまたenvironment = parent.frame()、私の小さなテストで動作するものを使用しました

library(formula.tools)

tf <- function(formula, faceting = NULL, data, print = TRUE) {
   y <- rhs(formula)
   x <- lhs(formula)

  p <- ggplot(environment = parent.frame()) 

  p <- p + geom_point(aes_string(x = x, y = y), data = data) 
   if (! is.null(faceting)){
     rhsfacet <- all.vars(rhs(faceting))
     lhsfacet <- all.vars(lhs(faceting))
     if(length(lhsfacet)==1 & any(lhsfacet %in% '.')) {lhsfacet <- NULL}
     if(length(rhsfacet)==1 & any(rhsfacet %in% '.')) {rhsfacet <- NULL}
     p <- p+ facet_grid(facet = list( lhsfacet, rhsfacet))}
  if(print) {print(p)}
  p 

}
tf(wt~mpg, faceting = ~am, data = mtcars, print = TRUE)

ここに画像の説明を入力

于 2013-02-07T02:35:04.340 に答える