我想将字符串N=xxx
设置为我的图的标题,其中xxx
是我作为data
参数传递给{{ggplot()
的数据框中的观察数。 1}}。在我当前的代码中,我第二次将该数据框作为sprintf()
的参数显式传递给labs()
:
ggplot(mtcars, aes(mpg, hp)) +
labs(title=sprintf("N=%i", nrow(mtcars))) +
geom_point()
这确实产生了所需的标题,但它不适用于更复杂的任务:我使用dplyr
管道来构建正在绘制的数据框,因为这是一个耗时的过程,我不想再次重复管道以获得如示例中的行数。
那么,如何从用于修改绘图的函数的参数规范中访问已作为参数传递给ggplot()
的数据框?
答案 0 :(得分:13)
mtcars %>% {
ggplot(., aes(mpg, hp)) +
labs(title = paste("N =", nrow(.))) +
geom_point()
}
请注意,在ggplot
花括号中包装整个{...}
调用时,必须使用.
点代词作为ggplot(., ...)
中的数据参数。然后,您可以使用呼叫中任意位置的.
代词回叫该对象。
答案 1 :(得分:4)
利用另一个magrittr
管道衬里功能的另一个选项:发球台操作员%T>%
。
library(ggplot2)
library(magrittr)
# to solidify where the variable will be out-of-scope defined
nr <- "oops"
mtcars %T>%
{ nr <<- nrow(.) } %>%
ggplot(aes(mpg, hp)) +
labs(title=sprintf("N=%i", nr)) +
geom_point()
(也可以使用dplyr
&#39; s do({nr <<- nrow(.)}) %>%
来完成。)
这与Brian的回答有两点不同:
主观上&#34;更清洁,&#34;,因为ggplot
代码没有在代码块中缩进。 (正如评论的那样,不同管道的混合也可能是负面的。)
通过在管道和ggplot管道之外创建nr
,它有副作用。通过预先分配nr
,我认为这可以减少到达当地环境以外的地方,但它仍然有点草率。