Ошибка при использовании оператора curly-curly внутри функции - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь создать функцию для запуска теста Крускала Уоллиса с моими данными, но с разными категориями группирования. Функция, которую я пытаюсь создать, сможет использовать имена различных группирующих категорий, представляющих интерес. Я основываю свой код на аналогичной проблеме, как показано здесь:

R: тест Крускала-Уоллиса в цикле по указанным столбцам в кадре данных

Я пытаюсь использовать новый оператор curly-curly из пакета rlang 0.4.

https://www.tidyverse.org/articles/2019/06/rlang-0-4-0/

Вот пример моей проблемы:

library(dplyr)
library(broom)
set.seed(123)

df <- tbl_df(data.frame(
  group_cat1 = as.factor(rep(c("a", "b", "c"), each = 5)),
  group_cat2 = as.factor(rep(c("x", "y", "z"), each = 5)),
  var1   = runif(15, 0, 10),
  var2    = runif(15, 0, 10),
  var3   = runif(15, 0, 10)))

models_df <- df %>% 
  gather(variable, result, -group_cat1) %>% 
  group_by(variable) %>% 
  do(kruskal.test(x = .$result, g =.$group_cat1) %>% tidy())

Это работает хорошо, однако, если я пытаюсь обобщить проблему, определив функцию, я не могу заставить ее работать.

get_linear_model <- function(group_category) {
  df %>% 
    gather(variable, result, -{{group_category}}) %>% 
  group_by(variable) %>% 
  do(kruskal.test(x = .$result, g =.${{group_category}) %>% tidy())
}

Я получаю следующую ошибку

Error: unexpected '{' in:
"  group_by(variable) %>% 
  do(kruskal.test(x = .$result, g =.${"

Я полагаю, что мне что-то не хватает в отношении окружения или того, как вообще использовать этот новый оператор фигурных фигурок. Я немного растерялся, поэтому любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 08 июля 2019

Во втором случае мы можем использовать [[ и преобразовать в символьную строку, так как $ не будет работать хорошо

get_linear_model <- function(group_category) {

  df %>% 
    gather(variable, result, -{{group_category}}) %>% 
    group_by(variable) %>% 
    do(kruskal.test(x = .$result, 
       g = .[[rlang::as_name(enquo(group_category))]]) %>% 
            tidy())
    }

models_df2 <- get_linear_model(group_cat1)
identical(models_df, models_df2)
#[1] TRUE

В коде OP ошибка связана с несбалансированными скобками

 ...
  do(kruskal.test(x = .$result, g =.${{group_category}) %>% tidy())
                                     ^^^            ^^^
                                      2              1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...