如何在R中的自定义函数中将动态列名传递给管道。

7

我使用 dplyr::mutate() 创建了一个动态列名,参考了这个主题 Use dynamic variable names in `dplyr`,现在我想对新列进行排序...... 但我没有正确传递列名。

library(glue)
library(dplyr)

# data
set.seed(123)
df <- data.frame(distance = sample(1:100, size = 10))

# custom function
multiply_function <- function(df, metric, multiplier){
  
  df %>% 
    mutate(., "{{metric}}_x{{multiplier}}" := {{metric}} * multiplier) %>% 
    arrange(desc("{{metric}}_x{{multiplier}}")) # <--- this is not working
}

df %>% 
  multiply_function(., metric = distance, multiplier = 3)

   distance distance_x3
1        31          93
2        79         237
3        51         153
4        14          42
5        67         201
6        42         126
7        50         150
8        43         129
9        97         291
10       25          75
2个回答

5

很遗憾,我不知道有没有办法将那个漂亮的粘合语法与任何不在一个:=左侧的东西一起使用。 这就是魔法发生的地方。如果您自己处理明确的转换并手动构建字符串,则可以使某些东西工作。虽然不美观,但这可行。

multiply_function <- function(df, metric, multiplier){
  metric <- ensym(metric)
  newname <- glue::glue("{rlang::as_string(metric)}_x{as.character(multiplier)}")
  df %>% 
    mutate("{newname}" := !!metric * multiplier) %>% 
    arrange(desc(.data[[newname]]))
}

如果我想将度量和乘数作为列表传递,以便可以循环遍历每个元素,我该如何修改这个代码? - seansteele
我在这里创建了一个新问题:https://dev59.com/U3ANtIcB2Jgan1zntkPQ - seansteele

2

我不确定将这个排列步骤放在函数内是否最好,如果该函数本身是管道的一部分,则可能会出现问题。如果要创建多个变量,则可能会出现问题。对于一个新变量:

multiply_function <- function(df, metric, multiplier){
  df %>% 
    mutate("{{metric}}_x{{multiplier}}" := {{metric}} * multiplier) %>%
    arrange(desc(!!rlang::sym(setdiff(names(.), names(df)))))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接