2017-07-21 4 views
1

Je m'excuse si cette question a été posée avec la terminologie que je ne reconnais pas, mais il ne semble pas être.automatiser l'entrée à la requête de l'utilisateur dans R

J'utilise la fonction comm2sci dans la bibliothèque taxize pour rechercher les noms scientifiques d'une base de données de plus de 120 000 lignes de noms communs. Voici un sous-ensemble de 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") 

Lors de la recherche avec la base de données NCBI dans cette fonction, il demande l'entrée d'utilisateur si le nom commun est générique/général et non des espèces spécifiques, par exemple l'appel suivant demandera clarification pour "AARDVARK" en entrant "1", "2" ou "return" pour "NA".

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

À cause de cela, je ne peux pas compter sur cette fonction pour trouver les noms des espèces 120000 sans moi assis et en entrant « retour » toutes les quelques minutes. Je sais que cette question est spécifique à taxize - mais j'ai déjà eu cette situation dans le passé avec d'autres fonctions. Ma question est la suivante: existe-t-il un moyen général de placer l'appel comm2sci dans une instruction conditionnelle qui renverra une valeur spécifique lorsque l'utilisateur est invité à entrer? Ou sinon écrire une fonction qui retournera une entrée lorsque vous y êtes invité?

Toutes les recherches liées à ce point indiquent comment demander une entrée utilisateur, mais pas comment remplacer les requêtes utilisateur. Ce sont deux des fils de questions que j'ai trouvés, mais je n'arrive pas à les appliquer à ma situation: Make R wait for console input?, Switch R script from non-interactive to interactive

J'espère que c'était clair. Merci beaucoup pour votre temps!

+0

Je viens d'exécuter votre code, et on m'a seulement demandé d'entrer '1' ou '2' quand il y avait plus d'un UID pour le taxon' AARDVARK' - est-ce que vous voulez automatiser ?? –

+0

Oui exactement, avec 120 000 observations, il n'y a aucun moyen de s'asseoir et d'entrer 1 ou 2 avec chaque nom commun ambigu. Y a-t-il un moyen d'automatiser l'entrée? –

+0

Avez-vous essayé d'envoyer un courriel à l'auteur de la fonction? Je vois un email trouvé '' comm2sci' qui peut conduire à une solution simple. –

Répondre

0

Ainsi, les fonctions get_*, utilisées en interne, demandent toutes par défaut une entrée utilisateur lorsqu'il y a> 1 option. Mais, toutes ces fonctions ont une fonction soeur avec un trait de soulignement, par exemple, get_uid_ qui ne demande pas d'entrée, et retourne toutes les données. Vous pouvez l'utiliser pour obtenir toutes les données, puis les traiter comme bon vous semble.

apporté quelques modifications à comm2sci, donc première mise à jour: devtools::install_github("ropensci/taxize")

Voici un exemple.

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

Utilisez ensuite get_uid_ pour obtenir toutes les données

ids <- get_uid_(commnames) 

traiter les résultats en ids que vous le souhaitez. Ici, par souci de concision, nous allons simplement prendre la première rangée de chaque

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

saisir ensuite les UID sur

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

et passer à 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" 

Notez que renvoie les noms communs NCBI de get_uid/get_uid_, de sorte que vous pouvez simplement aller de l'avant et les retirer si vous voulez

+0

Cela semble très bien, va le tester dès que possible. Mais une question rapide à clarifier: 'get_uid/get/uid_' sont pour NCBI, et il y a d'autres fonctions' get_ * 'pour les autres bases de données taxent les supports? Merci beaucoup @sckott –

+0

Oui, ce sont pour NCBI. ils appellent leurs identifiants taxonomiques "uid" - Oui, il y a des fonctions 'get_' pour 13 sources de données diff. – sckott

+0

Bonjour @sckott, Tout d'abord, je vous avais upvoted si j'avais la réputation de le faire. Encore une question. Le code que vous avez envoyé choisit la première ligne de chaque objet dans la liste des identifiants avec la fonction lapply. Le problème est - je ne veux pas prétendre que nous connaissons l'espèce exacte si le nom commun est ambigu, donc je préfère choisir 'NA' (comme dans l'option donnée par la requête de l'utilisateur). Lorsque je place un objet dans la liste des identifiants dans un cadre de données vide de valeurs NA (avec les mêmes noms de colonnes que ceux fournis par get_uid_), l'appel as.uid() renvoie une erreur, qui se produit également avec des noms communs non reconnus. –