#r #parsing #expression #eval
#r #синтаксический анализ #выражение #eval
Вопрос:
Я пытаюсь eval(parse())
получить имена переменных из символьного вектора, но eval()
возвращает только содержимое последней переменной:
Мой код:
c <- c(1,1)
a <- c(1,0)
t <- c(0,1)
g <- c(0,0)
sequence <- c("a", "t", "g", "t", "g", "t", "a", "c")
eval(parse(text=sequence))
Он должен возвращать:
[1] 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1
Но он просто возвращает соответствие последнему элементу вектора: c
[1] 1 1
Ответ №1:
Мы можем использовать mget
для получения всех значений объекта в a list
, затем unlist
list
для создания vector
unlist(mget(sequence), use.names = FALSE)
#[1] 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1
Для eval(parse
этого требуется length
значение, равное 1. Мы можем перебирать sequence
и выполнять eval
(не рекомендуется)
c(sapply(sequence, function(x) eval(parse(text = x))))
#[1] 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1
Комментарии:
1. Мне определенно нравится первый способ. Я предполагаю, что мой вопрос (больше для OP, а не для вас) заключается в том, должны ли объекты просто находиться в a
list()
в первую очередь.2. @Adam Возможно, что операция является новой
R
, и когда вы новичок, трудно понять, какlist
она работает. Итак, они создают объекты в глобальной среде.3. @akrun абсолютно прав! 😉 @Adam объект является вектором в списке. Это
Value
функцияreadfasta
из пакетаseqinr
.
Ответ №2:
Я понял, что могу сделать это с:
bin <- NULL
for(n in 1:length(sequence)) {
bin <- append(bin, eval(parse(text=sequence[n])))
}
Но мне интересно, есть ли более простой способ сделать это без цикла for.