在 R 中自动输入到用户查询



如果这个问题是用我不认识的术语提出的,但似乎不是,我深表歉意。

我正在使用taxize库中comm2sci函数来搜索包含超过 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数据库进行搜索时,如果通用名称是通用/通用名称而不是特定于物种,则它会要求用户输入,例如,以下调用将通过输入"1","2"或"返回"来要求澄清"AARDVARK"为"NA"。

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

正因为如此,我不能依靠这个函数来查找 120000 种物种的名称,而无需我每隔几分钟坐下来输入"返回"。我知道这个问题听起来taxize具体 - 但我过去在其他功能上也遇到过这种情况。我的问题是:是否有一种通用方法可以将comm2sci调用放在条件语句中,该语句将在提示用户输入时返回特定值?或者编写一个在提示时返回一些输入的函数?

与此相关的所有搜索都告诉我如何请求用户输入,但不知道如何覆盖用户查询。这是我发现的两个问题线程,但我似乎无法将它们应用于我的情况:让 R 等待控制台输入?,将 R 脚本从非交互式切换到交互式

我希望这是清楚的。非常感谢您的时间!

因此,内部使用的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,])

然后把 uid 的拿出

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_返回常用名称,因此您可以根据需要继续将其删除

相关内容

  • 没有找到相关文章

最新更新