Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何访问已传递给ggplot()的数据帧?_R_Ggplot2_Magrittr - Fatal编程技术网

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后见之明。