在 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
转换为 sym
bol并评估 (!!
) - 优点是它可以同时采用带引号或不带引号的列名
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
我想在另一个函数中使用 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
转换为 sym
bol并评估 (!!
) - 优点是它可以同时采用带引号或不带引号的列名
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