#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(" ")))