R 新的tidy eval大括号{{}有什么作用?跨函数传递参数并使用as_标签
最近,当我试图解决将参数从基于R 新的tidy eval大括号{{}有什么作用?跨函数传递参数并使用as_标签,r,ggplot2,dplyr,tidyeval,R,Ggplot2,Dplyr,Tidyeval,最近,当我试图解决将参数从基于dplyr的函数传递到ggplot函数的问题时,我惊讶地发现有一个全新的vignette和相应的版本。我希望一箭双雕:学习新的美食咒语,解决我的问题 我想要一个函数来进行自定义绘图,有时可能会被另一个函数调用,该函数对提供的数据进行一些预处理;但它失败的原因如下: 库(ggplot2) 图书馆(dplyr) 我的图% is.character() 如果(!char\u col)cat(颜色变量,“不是字符”) ggplot(df)+ 几何点(aes(x=!!ensy
dplyr
的函数传递到ggplot
函数的问题时,我惊讶地发现有一个全新的vignette和相应的版本。我希望一箭双雕:学习新的美食咒语,解决我的问题
我想要一个函数来进行自定义绘图,有时可能会被另一个函数调用,该函数对提供的数据进行一些预处理;但它失败的原因如下:
库(ggplot2)
图书馆(dplyr)
我的图%
is.character()
如果(!char\u col)cat(颜色变量,“不是字符”)
ggplot(df)+
几何点(aes(x=!!ensym(x_var),y=hp,颜色=!!ensym(颜色_var)))+
实验室(标题=粘贴(“传入x变量:”,x_变量))
}
流程图%
过滤器(!!ensym(x_var)>val)%>%
我的绘图(x_var=x_var,color_var=color_var)
}
流程图(“显示”,200,“循环”)
#>您正在筛选变量“disp”
#>共青团不是性格。
我的情节(mtcars、disp、cyl)
#>共青团不是性格。
我意识到我本可以使用aes\u string
。。。但我实际上是在ggraph
中操作的,并且忘记了,因为我从来没有在那里使用过aes\u string
。另外,我认为使用字符串作为参数是最简单的方法,但仍然更喜欢使用不带引号的变量名调用函数
因此,当直接调用my_plot
时,一切正常;当被称为“间接”时,几乎起了作用。渐晕图并没有完全涵盖这些用例,所以我必须进行测试
但是,更换!!ensym(x_var)
与上面的{{x_var}}
不起作用;下面使用简单变量名的天真方法也是如此{{}
根据小插曲,似乎将enquo(s)
和的步骤结合起来了!!(!)代码>
库(ggplot2)
图书馆(dplyr)
图书馆(rlang)
我的图%
is.character()
如果(!离散列)cat(颜色变量,“不是字符”)
ggplot(df)+
几何点(aes(x={{x},y=hp,COLOR={{colour}))+
labs(title=paste(“传入x变量:”,作为{x_var}})标签)
}
流程图%
筛选器({x_var}}>val)%>%
我的绘图(x_var=x_var,color_var=color_var)
}
流程图(显示,200,循环)
#>is_quosure(quo)中出错:未找到对象“disp”
我的绘图(mtcars、disp、cyl)
#>错误:找不到对象“cyl”
请注意,删除实验室
确实会使我的图
工作正常,正如小插曲中所预期的那样。在等待真正的专家解释一些血淋淋的细节时,解决方案如下:
库(ggplot2)
图书馆(dplyr)
图书馆(rlang)
我的图%
is.character()
如果(!char_col)cat(作为标签(enquo(color_var)),“不是字符。”)
ggplot(df)+
几何点(aes(x={{x},y=hp,COLOR={{colour}))+
实验室(标题=粘贴(“传入x变量:”,作为标签(enquo(x变量)))
}
流程图%
筛选器({x_var}}>val)%>%
my_plot(x_var={{x_var}},color_var={{{color_var}})
}
流程图(显示,200,循环)
#>您正在筛选变量disp
#>共青团不是性格。
我的绘图(mtcars、disp、cyl)
#>共青团不是性格。
最后,您可以enquo
,这样就像标签一样
工作,而且,令人惊讶的是,{{}
仍然知道该做什么。如果使用ensym
和作为字符串,则同样适用
您也可以简单地执行以下操作:
geom_point(aes(x = {{ x_var }} , y = hp, colour = {{colour_var}})) +
labs(title = paste("Passed in x variable:", as_label( enquo(x_var) )))
使用{{passing_arg}}
(与使用!!enquo(passing_arg)
相同)可以解决函数间参数的传递问题
至于为什么原始函数只适用于colour\u var
,出于我仍然不太理解的原因,ensym()
将x\u var
参数promise解释为一个简单的字符串。一旦你改变了承诺,例如,通过在另一个函数调用中使用它,就像我在color\u var
中所做的那样,它就工作了。在等待真正的专家解释一些血淋淋的细节时,解决方案如下:
库(ggplot2)
图书馆(dplyr)
图书馆(rlang)
我的图%
is.character()
如果(!char_col)cat(作为标签(enquo(color_var)),“不是字符。”)
ggplot(df)+
几何点(aes(x={{x},y=hp,COLOR={{colour}))+
实验室(标题=粘贴(“传入x变量:”,作为标签(enquo(x变量)))
}
流程图%
筛选器({x_var}}>val)%>%
my_plot(x_var={{x_var}},color_var={{{color_var}})
}
流程图(显示,200,循环)
#>您正在筛选变量disp
#>共青团不是性格。
我的绘图(mtcars、disp、cyl)
#>共青团不是性格。
最后,您可以enquo
,这样就像标签一样
工作,而且,令人惊讶的是,{{}
仍然知道该做什么。如果使用ensym
和作为字符串,则同样适用
您也可以简单地执行以下操作:
geom_point(aes(x = {{ x_var }} , y = hp, colour = {{colour_var}})) +
labs(title = paste("Passed in x variable:", as_label( enquo(x_var) )))
使用{{passing_arg}}
(与使用!!enquo(passing_arg)
相同)可以解决函数间参数的传递问题
至于为什么原始函数只适用于colour\u var
,出于我仍然不太理解的原因,ensym()
将x\u var
参数promise解释为一个简单的字符串。一旦您转换了承诺,例如,通过在另一个函数调用中使用它,就像我对colour\u var
所做的那样,它就工作了。您基本上是正确的,{}
语法是的快捷方式
g1 <- function(x) as_label(enquo(x))
g2 <- function(x) as_label(ensym(x))
g1("hello")
# [1] "\"hello\""
g1(hello)
# [1] "hello"
g2("hello")
# [1] "hello"
g2(hello)
# [1] "hello"
foo <- function(x) {
ensym(x)
}
a1 <- function(x) {
foo(x)
}
a2 <- function(x) {
foo({{x}})
}
a3 <- function(x) {
foo(!!ensym(x))
}
a1(test)
# x
a2(test)
# test
a3(test)
# test