R 如何访问已传递给ggplot()的数据帧?
我想将字符串R 如何访问已传递给ggplot()的数据帧?,r,ggplot2,magrittr,R,Ggplot2,Magrittr,我想将字符串N=xxx设置为我的图的标题,其中xxx是作为data参数传递给ggplot()的数据框中的观察数。在我当前的代码中,我第二次显式地将该数据帧作为参数传递给我在labs()中使用的sprintf(): ggplot(mtcars、aes(mpg、hp))+ 实验室(标题=sprintf(“N=%i”,nrow(mtcars))+ 几何点() 这确实会生成所需的标题,但它不适用于更复杂的任务:我使用dplyr管道来构造正在绘制的数据帧,由于这是一个耗时的过程,我不想再次重复管道以获得
N=xxx
设置为我的图的标题,其中xxx
是作为data
参数传递给ggplot()
的数据框中的观察数。在我当前的代码中,我第二次显式地将该数据帧作为参数传递给我在labs()中使用的sprintf()
:
ggplot(mtcars、aes(mpg、hp))+
实验室(标题=sprintf(“N=%i”,nrow(mtcars))+
几何点()
这确实会生成所需的标题,但它不适用于更复杂的任务:我使用dplyr
管道来构造正在绘制的数据帧,由于这是一个耗时的过程,我不想再次重复管道以获得示例中所示的行数
那么,如何从用于修改绘图的函数的参数规范中访问作为参数传递给ggplot()
的数据帧
mtcars %>% {
ggplot(., aes(mpg, hp)) +
labs(title = paste("N =", nrow(.))) +
geom_point()
}
请注意,当包装整个ggplot
调用{…}
大括号时,必须使用
点代词作为ggplot(,…)
中的数据参数。然后,您可以在调用中的任意位置使用
代词回调该对象
另一个利用了magrittr
另一个管道内衬功能的选项:T形三通操作器%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()
库(ggplot2)
图书馆(magrittr)
#巩固变量将超出定义范围的位置
nr%
{nr好极了,这正是我想要的。我模模糊糊地记得关于使用
,但不知道在哪里可以找到它。多亏了你的回答,我发现magrittr
小插图中描述了这一点:当然,你也可以使用sprintf
而不是粘贴
,以便更好地控制t这很好,我没有想到用{}来创建一个“函数”就像这样。@rsmith54,我发现自己一直在用%>%
和非tidyverse函数来做这件事,这些函数稍后会把数据
参数放进去,比如lmer
。是的,这是一个非常好的技巧。我想知道在答案中添加一些关于机制的信息是否也有用。我同意你在(2)中的评估由于它的副作用,这有点草率,这就是为什么我更喜欢Brian的答案。但这仍然是tee操作符的一个非常有趣的用法。主观上,我(当然,哈哈)更喜欢在大括号中设置ggplot
调用。这使得处理和打印对象在链中的分离更加清晰。布莱恩,这一点很好,混合管道总是“视觉上令人不安”。Schmuddi——完全同意。这会很好(尽管工作时间长达100小时,并且打破了不兼容)如果ggplot2
尊重%%>%%
而不是重载++
。有人试图协调它们:例如ggplot(mtcars,aes(mpg,wt))%%>%add_points()
也:,指的是关于管道和20/20后见之明。