автоматизировать ввод в пользовательский запрос в R

Я извиняюсь, если этот вопрос был задан с терминологией, которую я не узнаю, но, похоже, это не так.

Я использую функцию comm2sci в библиотеке taxize для поиска научных названий в базе данных, содержащей более 120 000 строк общеупотребительных имен. Вот подмножество из 10:

commnames <- c("WESTERN CAPERCAILLIE", "AARDVARK", "AARDWOLF", "ABACO ISLAND BOA", 
"ABBOTT'S DAY GECKO", "ABDIM'S STORK", "ABRONIA GRAMINEA", "ABYSSINIAN BLUE 
WINGED GOOSE", 
"ABYSSINIAN CAT", "ABYSSINIAN GROUND HORNBILL")

При поиске в базе данных NCBI в этой функции она запрашивает ввод пользователем, является ли общее название родовым/общим, а не специфичным для вида, например, следующий вызов потребует уточнения для «AARDVARK», введя «1», «2» или «возврат» для «NA».

install.packages("taxize")
library(taxize)
ncbioutput <- comm2sci(commnames, db = "ncbi")###querying ncbi database

Из-за этого я не могу полагаться на эту функцию, чтобы найти названия 120000 видов без того, чтобы сидеть и вводить «возврат» каждые несколько минут. Я знаю, что этот вопрос звучит taxize специфично, но в прошлом у меня была такая ситуация и с другими функциями. Мой вопрос: есть ли общий способ поместить вызов comm2sci в условный оператор, который будет возвращать определенное значение при запросе пользовательского ввода? Или иначе напишите функцию, которая будет возвращать некоторый ввод при появлении запроса?

Все поиски, связанные с этим, говорят мне, как запрашивать ввод пользователя, но не как переопределять пользовательские запросы. Это два потока вопросов, которые я нашел, но я не могу применить их к моей ситуации: Заставить R ждать ввода с консоли?, Переключить скрипт R с неинтерактивного на интерактивный

Надеюсь, это было понятно. Спасибо вам большое за ваше время!


person E Lundgren    schedule 21.07.2017    source источник
comment
Я только что запустил ваш код, и мне было предложено ввести 1 или 2 только тогда, когда было более одного UID для таксона AARDVARK — это то, что вы хотите автоматизировать??   -  person Evan Friedland    schedule 21.07.2017
comment
Да, именно, со 120 000 наблюдений невозможно сидеть и вводить 1 или 2 с каждым неоднозначным общим именем. Есть ли способ автоматизировать ввод?   -  person E Lundgren    schedule 21.07.2017
comment
Вы пробовали писать по электронной почте автору функции? Я вижу письмо по адресу ?comm2sci, которое может привести к простому решению.   -  person Evan Friedland    schedule 21.07.2017
comment
Да, я думаю, это вариант. Я отправлю ему электронное письмо. У меня была такая ситуация с другими функциями, и я подумал, что может быть общая стратегия для решения этой проблемы. Спасибо за совет Эван   -  person E Lundgren    schedule 21.07.2017


Ответы (1)


Таким образом, все функции get_*, используемые внутри, по умолчанию запрашивают ввод данных пользователем, когда есть > 1 вариант. Но у всех этих функций есть родственная функция с символом подчеркивания, например, get_uid_, которая не запрашивает ввод и возвращает все данные. Вы можете использовать это, чтобы получить все данные, а затем обработать их по своему усмотрению.

Внесены некоторые изменения в comm2sci, поэтому сначала обновите: devtools::install_github("ropensci/taxize")

Вот пример.

library(taxize)
commnames <- c("WESTERN CAPERCAILLIE", "AARDVARK", "AARDWOLF", "ABACO ISLAND BOA", 
               "ABBOTT'S DAY GECKO", "ABDIM'S STORK", "ABRONIA GRAMINEA", 
               "ABYSSINIAN BLUE WINGED GOOSE", 
               "ABYSSINIAN CAT", "ABYSSINIAN GROUND HORNBILL")

Затем используйте get_uid_, чтобы получить все данные

ids <- get_uid_(commnames)

Обработайте результаты в ids по своему усмотрению. Здесь для краткости мы возьмем только первую строку каждого

ids <- lapply(ids, function(z) z[1,])

Затем вытащите жидкость

ids <- as.uid(unname(vapply(ids, "[[", "", "uid")), check = FALSE)

И перейти к comm2sci

comm2sci(ids)

$`100830`
[1] "Tetrao urogallus"

$`9818`
[1] "Orycteropus afer"

$`9680`
[1] "Proteles cristatus"

$`51745`
[1] "Chilabothrus exsul"

$`8565`
[1] "Gekko"

$`39789`
[1] "Ciconia abdimii"

$`278977`
[1] "Abronia graminea"

$`8865`
[1] "Cyanochen cyanopterus"

$`9685`
[1] "Felis catus"

$`153643`
[1] "Bucorvus abyssinicus"

Обратите внимание, что NCBI возвращает общие имена из get_uid/get_uid_, поэтому вы можете просто удалить их, если хотите.

person sckott    schedule 21.07.2017
comment
Это выглядит великолепно, я проверю это, как только смогу. Но быстрый вопрос для уточнения: get_uid / get/uid_ предназначены для NCBI, а есть другие get_* функции для других баз данных, которые поддерживает таксиз? Большое спасибо @scott - person E Lundgren; 21.07.2017
comment
Да, это для NCBI. они называют свои таксономические идентификаторы uid's - Да, есть get_ функции для 13 различных источников данных. - person sckott; 21.07.2017
comment
Здравствуйте, @scott. Во-первых, я бы проголосовал за вас, если бы у меня была такая репутация. Еще один вопрос. Присланный вами код выбирает первую строку каждого объекта в списке идентификаторов с помощью функции lapply. Проблема в том, что я не хочу притворяться, что мы знаем точный вид, если общее название неоднозначно, поэтому я бы предпочел выбрать «NA» (как в варианте, указанном в пользовательском запросе). Когда я устанавливаю любой объект в списке идентификаторов в пустой фрейм данных значений NA (с теми же именами столбцов, что и в get_uid_), вызов as.uid() возвращает ошибку, что также происходит с нераспознанными общими именами. - person E Lundgren; 22.07.2017
comment
Выбор первой строки — это просто пример того, что вы можете сделать — вам не обязательно этого делать. Обрабатывайте, как вам нравится. с вашим утверждением Когда я устанавливаю любой объект в списке идентификаторов в пустой фрейм данных значений NA (с теми же именами столбцов, что и в get_uid_), вызов as.uid() возвращает ошибку, что также происходит с нераспознанными общими именами, которые я не не понимаю, что вы имеете в виду - вероятно, лучше всего открыть вопрос в репо: github.com/ropensci /taxize/issues/new - person sckott; 24.07.2017
comment
Например, если вы отправляете фиктивное или неправильно написанное общее имя: `id ‹- get_uid_(МЕНЬШИЙ МУСОРНЫЙ ЦЫПЛЕНОК)', результатом будет NULL, а окончательный результат от comm2sci(id) (после as_uid()): значения должны быть длина 1, но результат FUN(X[[1]]) имеет длину 10. Я рад открыть проблему в репозитории, но я нашел обходной путь для себя, выполняя одно имя за раз в for цикл и проверка на NULL для каждого случая. - person E Lundgren; 24.07.2017