我正确/合理地使用NSE和rlang吗?

时间:2017-06-28 18:02:12

标签: r dplyr tidyverse nse rlang

我一直在阅读programming with dplyr,并尝试将其描述的想法运用到我的工作中。我有一些有用的东西,但我不清楚我是否以“正确”的方式完成了它。我可以做些更优雅或更简洁的事情吗?

我有一个tibble,其中行是方案,列与在该方案中运行的测试相关。有两种类型的列,它们存储在该场景中计算的测试统计量以及存储该测试的自由度的列。

所以,这是我所拥有的数据类型的小型玩具示例:

library(tidyverse)
set.seed(27599)

my_tbl <- data_frame(test1_stat = rnorm(12), test1_df = rep(x = c(1, 2, 3), times = 4), 
                     test2_stat = rnorm(12), test2_df = rep(x = c(1, 2, 3, 4), times = 3))

我想计算每个测试的摘要,该测试将基于其stat及其df。我的例子是我想计算每个组的中位数stat,其中组由df定义。在测试中,分组不保证是相同的,也不保证组的数量相同。

所以,这就是我所做的:

get_test_median = function(df, test_name) {

  stat_col_name <- paste0(test_name, '_stat')
  df_col_name <- paste0(test_name, '_df')
  median_col_name <- paste0(test_name, '_median')

  df %>%
    dplyr::group_by(rlang::UQ(rlang::sym(df_col_name))) %>%
    dplyr::summarise(rlang::UQ(median_col_name) := median(x = rlang::UQ(rlang::sym(stat_col_name)), na.rm = TRUE))
}

my_tbl %>% get_test_median(test_name = 'test1')
my_tbl %>% get_test_median(test_name = 'test2')

这很有效。但是,有经验的rlang用户会这样做吗?我是NSE的新手,并且有点惊讶于重复使用两个嵌套的rlang函数(UQ(sym(.)))。

我很高兴使用UQ而不是!!,因为我对传统功能表示法感到满意。

根据评论,我摆脱了namespace::function符号,现在我的功能看起来并不那么冗长:

get_test_median = function(df, test_name) {

  stat_col_name <- paste0(test_name, '_stat')
  df_col_name <- paste0(test_name, '_df')
  median_col_name <- paste0(test_name, '_median')

  df %>%
    dplyr::group_by(UQ(sym(df_col_name))) %>%
    dplyr::summarise(UQ(median_col_name) := median(x = UQ(sym(stat_col_name)), na.rm = TRUE))
}

0 个答案:

没有答案