Использование `eval (parse ())` с вектором из нескольких элементов

#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.