在 R 函数中使用 unnest_tokens() 导致错误

Use of unnest_tokens() within function in R results in error

我想在另一个函数中使用 tidytext 中的 unnest_tokens 函数。

由于我传递的数据框中的列名称每次都可能不同,我尝试使用 [[x]] 来寻址列,我已经成功地在另一个函数中使用了它,但在这里它不起作用.

这是我使用的代码:

f1 <- function(df) {
  df2 <- df %>%
    unnest_tokens(df[[3]], df[[2]])
  return(df2)
}

data <- structure(list(Id = 1, Description = "Lorem ipsum dolor sit amet"), row.names = 1L, class = "data.frame")

result <- f1(data)

执行此操作时我得到

Fehler während wrapup: Input must be a character vector of any length or a list of character
  vectors, each of which has a length of 1.
Error: no more error handlers available (recursive errors?); invoking 'abort' restart

unnest_tokens 的第二个参数是 output 列名。它可以是任何列名。因此,我们可以将其称为 'word',第三个参数是输入列名称。这是 'Description'.

library(tidytext)
library(dplyr)
data %>% 
    unnest_tokens(word, Description)

在函数中执行此操作的一种方法是将列名作为参数传递。对于 tidyverse,选项是使用 curly-curly 运算符({{}} - 如果我们只想传递不带引号的参数)或者另一个选项是使用 ensym 转换为 symbol并评估 (!!) - 优点是它可以同时采用带引号或不带引号的列名

f1 <- function(dat, nm) {
         dat %>%
           unnest_tokens(word, !! ensym(nm))
 }

out1 <- f1(data, Description)
out2 <- f1(data, 'Description')
identical(out1, out2)
#[1] TRUE

out1
#   Id  word
#1    1 lorem
#1.1  1 ipsum
#1.2  1 dolor
#1.3  1   sit
#1.4  1  amet

如果要基于列位置并且是固定的,那么函数可以只取数据对象

f2 <- function(dat) {
         dat %>%
            unnest_tokens(word, !! rlang::sym(names(dat)[2]))
  }

out3 <- f2(data)
identical(out1, out3)
#[1] TRUE

将要取消嵌套的列名作为参数传递给函数,并使用 .data 在函数中引用它。

library(tidytext)
library(dplyr)

f1 <- function(df, col) {
  df %>% unnest_tokens(word, .data[[col]])
}

f1(data, 'Description')

#    Id  word
#1    1 lorem
#1.1  1 ipsum
#1.2  1 dolor
#1.3  1   sit
#1.4  1  amet