Кроме того, не используйте "определение", если Вы действительно, действительно не хотите определить глобальную переменную. Используйте "позволяют" вместо этого:
(defn goo []
(print "echo> ")
(flush)
(let [resp (read-line)]
(print resp)
(flush)))
или, короче
(defn goo []
(print "echo> ")
(flush)
(print (read-line))
(flush))
Вы можете использовать apply
(или sapply
)
t <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
f <- function(s) strsplit(s, "_")[[1]][1]
sapply(t, f)
bob_smith mary_jane jose_chung michael_marx charlie_ivan
"bob" "mary" "jose" "michael" "charlie"
И еще один подход:
t <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
pieces <- strsplit(t,"_")
sapply(pieces, "[", 1)
На словах последняя строка извлекает первый элемент каждого компонента списка и затем упрощает его до вектора.
Как это работает? Что ж, вам нужно реализовать альтернативный способ записи x [1]
: "[" (x, 1)
, то есть есть функция с именем [
что делает подмножество. Вызов sapply
применяет вызовы этой функции один раз для каждого элемента исходного списка, передавая два аргумента, элемент списка и 1.
Преимущество этого подхода перед другими заключается в том, что вы можете извлечь несколько элементы из списка без повторного вычисления разбиений. Например, фамилия будет sapply (шт., "[", 2)
. Когда вы привыкнете к этой идиоме, ее будет довольно легко читать.
How about:
tlist <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
fnames <- gsub("(_.*)$", "", tlist)
# _.* matches the underscore followed by a string of characters
# the $ anchors the search at the end of the input string
# so, underscore followed by a string of characters followed by the end of the input string
for the RegEx approach?
Я сомневаюсь, что это самое элегантное решение, но оно превосходит цикл:
t.df <- data.frame(tsplit)
t.df[1, ]
Преобразование списков в фреймы данных - это единственный способ заставить их делать то, что я хочу. Я с нетерпением жду ответов людей, которые действительно понимают, как работать со списками.
Вы почти получили это. Это на самом деле просто вопрос
* apply
для перебора существующего списка, я часто начинаю с lapply
и иногда переключаю в sapply
strsplit (string, splitterm)
и вам нужен odd [[1]] [1]
, чтобы выбрать первый член ответа t
или c
и друзья) , что дает
> tlist <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
> fnames <- sapply(tlist, function(x) strsplit(x, "_")[[1]][1])
> fnames
bob_smith mary_jane jose_chung michael_marx charlie_ivan
"bob" "mary" "jose" "michael" "charlie"
>
Вы можете использовать unlist ()
:
> tsplit <- unlist(strsplit(t,"_"))
> tsplit
[1] "bob" "smith" "mary" "jane" "jose" "chung" "michael"
[8] "marx" "charlie" "ivan"
> t_out <- tsplit[seq(1, length(tsplit), by = 2)]
> t_out
[1] "bob" "mary" "jose" "michael" "charlie"
Может быть, лучше способ вытащить только нечетно проиндексированные записи, но в любом случае вы выиграли '
И еще один подход, основанный на в примере unlist brentonk ...
tlist <- c ("bob_smith", "mary_jane", "jose_chung", "michael_marx", "charlie_ivan")
tsplit <- unlist (strsplit (tlist, "_" ))
fnames <- tsplit [seq (1: length (tsplit)) %% 2 == 1]
Как насчет:
t <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
sub("_.*", "", t)