Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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 新的tidy eval大括号{{}有什么作用?跨函数传递参数并使用as_标签_R_Ggplot2_Dplyr_Tidyeval - Fatal编程技术网

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