Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.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引用函数中的变量?_R_Tidyverse_Tidyeval - Fatal编程技术网

R 重命名后如何使用tidy eval引用函数中的变量?

R 重命名后如何使用tidy eval引用函数中的变量?,r,tidyverse,tidyeval,R,Tidyverse,Tidyeval,在使用tidy求值重命名变量名称后,是否可以引用该变量名称?例如,我想编写一个函数,该函数执行与以下代码相同的操作,但允许在函数参数中指定新变量名: 图书馆管理员 mtcars%>% 重命名气缸=气缸%>% 气缸组%>% SummaryMean\u mpg=平均mpg 但是,我被困在下面代码中的一行一行的组中,因为两者都不是!!varname或{{varname}}可以替代问号。我猜!!varname无法工作,因为它扩展为字符串;而且{varname}}不起作用,因为调用函数时不存在具有新名称的

在使用tidy求值重命名变量名称后,是否可以引用该变量名称?例如,我想编写一个函数,该函数执行与以下代码相同的操作,但允许在函数参数中指定新变量名:

图书馆管理员 mtcars%>% 重命名气缸=气缸%>% 气缸组%>% SummaryMean\u mpg=平均mpg 但是,我被困在下面代码中的一行一行的组中,因为两者都不是!!varname或{{varname}}可以替代问号。我猜!!varname无法工作,因为它扩展为字符串;而且{varname}}不起作用,因为调用函数时不存在具有新名称的列。我也看不到使用glue语法的方法,因为这行中没有任何内容

my_rename <- function(df, varname) {
  df %>% 
    rename("{varname}" := cyl) %>% 
    group_by(???) %>%
    summarize(mean_mpg = mean(mpg))
}

用{{varname}}运行这两种方法似乎都有效

my_rename <- function(df, varname) {
  df %>% 
    rename({{varname}} := cyl) %>% 
    group_by({{varname}}) %>%
    summarize(mean_mpg = mean(mpg))
}

my_rename(mtcars, cylinder)

# A tibble: 3 x 2
  cylinder mean_mpg
     <dbl>    <dbl>
1        4     26.7
2        6     19.7
3        8     15.1


用{{varname}}运行这两种方法似乎都有效

my_rename <- function(df, varname) {
  df %>% 
    rename({{varname}} := cyl) %>% 
    group_by({{varname}}) %>%
    summarize(mean_mpg = mean(mpg))
}

my_rename(mtcars, cylinder)

# A tibble: 3 x 2
  cylinder mean_mpg
     <dbl>    <dbl>
1        4     26.7
2        6     19.7
3        8     15.1


为了使函数正常工作,首先必须取消自定义参数名称。为此,我们可以使用ensym或enquo函数来消除用户定义的参数。之后,你应该使用砰砰!!操作员取消引用它

my_rename <- function(df, varname) {
  varname <- ensym(varname)
  
  df %>% 
    rename(!!varname := cyl) %>% 
    group_by(!!varname) %>%
    summarize(mean_mpg = mean(mpg))
}

my_rename(mtcars, cylinder)

# A tibble: 3 x 2
  cylinder mean_mpg
     <dbl>    <dbl>
1        4     26.7
2        6     19.7
3        8     15.1

为了使函数正常工作,首先必须取消自定义参数名称。为此,我们可以使用ensym或enquo函数来消除用户定义的参数。之后,你应该使用砰砰!!操作员取消引用它

my_rename <- function(df, varname) {
  varname <- ensym(varname)
  
  df %>% 
    rename(!!varname := cyl) %>% 
    group_by(!!varname) %>%
    summarize(mean_mpg = mean(mpg))
}

my_rename(mtcars, cylinder)

# A tibble: 3 x 2
  cylinder mean_mpg
     <dbl>    <dbl>
1        4     26.7
2        6     19.7
3        8     15.1

关于粘合语法,您需要{{varname}}:=而不是{varname}。简单的curly是普通的glue语法,它获取变量中的字符串。double curly是扩展的glue语法,它查看函数参数以查看用户键入的内容。因此,正确的语法是:

my_rename <- function(df, varname) {
  df %>% 
    rename("{{ varname }}" := cyl) %>% 
    group_by({{ varname }}) %>%
    summarize(mean_mpg = mean(mpg))
}

my_rename(mtcars, cylinder)
#> # A tibble: 3 x 2
#>   cylinder mean_mpg
#>      <dbl>    <dbl>
#> 1        4     26.7
#> 2        6     19.7
#> 3        8     15.1
与此相反:

rlang::quo(cylinder)
#> <quosure>
#> expr: ^cylinder
#> env:  global

关于粘合语法,您需要{{varname}}:=而不是{varname}。简单的curly是普通的glue语法,它获取变量中的字符串。double curly是扩展的glue语法,它查看函数参数以查看用户键入的内容。因此,正确的语法是:

my_rename <- function(df, varname) {
  df %>% 
    rename("{{ varname }}" := cyl) %>% 
    group_by({{ varname }}) %>%
    summarize(mean_mpg = mean(mpg))
}

my_rename(mtcars, cylinder)
#> # A tibble: 3 x 2
#>   cylinder mean_mpg
#>      <dbl>    <dbl>
#> 1        4     26.7
#> 2        6     19.7
#> 3        8     15.1
与此相反:

rlang::quo(cylinder)
#> <quosure>
#> expr: ^cylinder
#> env:  global

有趣的是,这很管用。我认为我必须将新变量名作为字符串传递,因为在使用rename行中首次计算时,它不是数据变量。我也不知道:=可以用于任何左手边没有字符串的东西。从这部有趣的作品中不太清楚。我认为我必须将新变量名作为字符串传递,因为在使用rename行中首次计算时,它不是数据变量。我也不知道:=可以用于任何左手边没有字符串的东西。不太清楚,谢谢你的解释!我应该提到,我将变量名作为字符串传递,因此使用了单大括号。这段代码似乎可以工作,因为rename秘密地接受字符串和数据变量?谢谢你的解释!我应该提到,我将变量名作为字符串传递,因此使用了单大括号。这段代码似乎有效,因为rename秘密地接受字符串和数据变量?