Почему str_split() добавляет дополнительный слой списка?

#r #stringr

#r #stringr

Вопрос:

Доступ к токенам из строки кажется чрезмерно сложным. Должно быть, есть какая-то необъяснимая концепция, которую я упускаю. Я был бы очень признателен за понимание того, почему str_split() это работает таким образом.

 s = "hello world"
t = tokens = str_split(s, fixed(" "))
# attempts to get first token:

tokens[1]
# [[1]]
# [1] "hello" "world"

tokens[1][1]
# [[1]]
# [1] "hello" "world"

tokens[[1]]
# [1] "hello" "world"

tokens[[1]][1]
# [1] "hello"
  

Я понимаю, что он делает. Я просто не понимаю, почему это так работает. Другие функции тоже иногда добавляют дополнительный слой. И это обычный источник разочарования для меня в R. Понимание ТОГО, ПОЧЕМУ, может помочь мне в будущем.

Комментарии:

1. Потому что он векторизован, поэтому он тоже может это делать : str_split(c("hello world","foo bar"),fixed(" ")) .

2. Да, но многие функции векторизованы, которые этого не делают. Например, передача 1:99 в function(a) {a 1} вернет вектор, а не список.

3. Верно, но в этом случае единственное разумное значение по умолчанию — возвращать список. Если бы вы по умолчанию сгладили результаты в вектор, и каждый фрагмент разделили на разное количество фрагментов, было бы настоящей проблемой выяснить, что взялось из какого элемента исходного вектора.

Ответ №1:

Вы всегда можете добавить simplify = TRUE в str_split() :

 s = "hello world"
t = tokens = str_split(s, fixed(" "), simplify = TRUE)

tokens
#       [,1]    [,2]   
#  [1,] "hello" "world"

tokens[1]
# [1] "hello"

tokens[2]
# [2] "world"
  

Ответ №2:

ответ @semaphorism правильный (я поддержал его), но он не отвечает на вопрос «почему».Все stringr функции векторизованы, поэтому они возвращают список, где первый элемент возвращаемого списка является результатом применения функции к первому элементу векторного ввода, таким образом, вы знаете, каковы выходные данные для каждого элемента векторов. другой обходной путь — просто отменить его:

 unlist(str_split(s, fixed(" ")))