Tidyverse unnest_tokens не работает внутри функции

У меня есть unnest_tokens функция, которая работает в коде, но как только я помещаю ее в функцию, я не могу заставить ее работать. Я не понимаю, почему это происходит, когда я помещаю его в функцию.

данные:

id          words

1           why is this function not working
2           more text
3           help me
4           thank you
5           in advance
6           xx xx

Данные проверяются stringsAsFactors == FALSE, и если это Vector.

is.vector(data$words)
[1] TRUE
is.vector(data$id)
[1] TRUE
typeof(data$words)
[1] "character"

Вот код вне функции, который дает правильный результат:

df <- x %>% 
  unnest_tokens(word, words)%>%
  group_by(id)

1 why
1 is
1 this
1 function
1 not
1 working
2 more
2 text
3 help
3 me
4 thank
4 you
5 in
5 advance
6 xx
6 xx

Как только я помещаю код в функцию, я получаю сообщение об ошибке.

tidy_x <- unnestDF(data, "words", "id")

unnestDF <- function(df, col, groupbyCol) {
  x <- df %>%
    unnest_tokens(word, df[col])%>%
    group_by(df[groupbyCol])
  return(x)
}

Ошибка в check_input (x): ввод должен быть вектором символов любой длины или списком векторов символов, каждый из которых имеет длину 1.

Заранее спасибо.


person Dennis Loos    schedule 28.06.2018    source источник


Ответы (1)


Поскольку мы используем аргументы в кавычках, одним из вариантов было бы преобразовать в символ, а затем оценить (!!) в unnest_tokens и вместо group_by использовать group_by_at, который может принимать строки

unnestDF <- function(df, col, groupbyCol) {
  df %>%
    unnest_tokens(word, !! rlang::sym(col))%>%
    group_by_at(groupbyCol)

   }


unnestDF(data, "words", "id")
# A tibble: 16 x 2
# Groups:   id [6]
#      id word    
# * <int> <chr>   
# 1     1 why     
# 2     1 is      
# 3     1 this    
# 4     1 function
# 5     1 not     
# 6     1 working 
# 7     2 more    
# 8     2 text    
# 9     3 help    
#10     3 me      
#11     4 thank   
#12     4 you     
#13     5 in      
#14     5 advance 
#15     6 xx      
#16     6 xx      
person akrun    schedule 28.06.2018