当前位置: 首页 > 知识库问答 >
问题:

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

都才俊
2023-03-14

基于这个线程,我创建了一个动态列名w/dplyr::mutate(),在'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个答案

拓拔飞飙
2023-03-14

如果某个函数是管道本身的一部分,我不确定这个排列步骤是否最好放在该函数中。如果试图制造几个变量,可能会出现问题。对于一个新变量:

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

不幸的是,我不知道是否有任何方法可以将这个好的粘合语法用于不在:=左侧的任何东西。奇迹就在那里发生了。你可以得到一些工作,如果你照顾显式转换求和你自己,并手动做字符串建设。虽然不好看,但这很管用

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]]))
}
 类似资料:
  • 我有一个具有以下结构的数据集: 我想提供一个函数,它允许计算任何值之间的差异,我想这样做使用s这样的函数:(假设参数和作为参数传递) 当然,这不起作用,因为使用非标准评估。我知道现在有一个优雅的解决方案,可以使用来解决这个问题,我已经读过这个小插曲,但我仍然无法理解它。 怎么办? 以下是数据集的前几行,以获得一个可复制的示例

  • 我尝试使用以下代码来完成此操作: 我得到以下输出: sim(测试,“测试”)

  • 我编写了这个函数,它只是用子字符串替换数据表列中的每个值: 但每次我试着运行它时,我都会发现错误: 现在我已经做了很多关于为什么它不起作用的研究,但我不明白。我读过一些关于标准评估和懒散的东西,但我尝试的似乎都不管用。有什么帮助吗? 谢谢

  • 问题内容: 我是AngularJS的新手。我做了一个自定义指令,我想通过使用变量在类属性中动态调用它。例如, 当我在以下代码中使用此变量时: 其结果必须显示两个具有指定值的输入字段。但是它没有这样做。当我更换使用。它工作正常,意味着显示两个输入字段,并带有指定的值。有人可以告诉我我在做什么错吗? 这是index.html 这是script.js template.html包含: 问题答案: 不幸的

  • 问题内容: 我想在SASS中动态创建mixins,以列表中的每个项目命名,但是似乎不起作用。 我尝试了这个,但出现错误: 错误: SASS不支持此用法吗?我在手册中找不到任何相关内容。 问题答案: 当前似乎不支持@mixins中的变量插值。 SASS文档将其称为并描述如下: 插值:#{} 您还可以使用#{}插值语法在 选择器 和 属性名称中 使用SassScript变量: 根据文档,仅选择器和属性

  • 问题内容: 我正在尝试将自己的自定义对象传递到包中: 我得到错误: 问题答案: 一种方法是让您的自定义对象实现Parcelable接口并使用