R: For 循环复制错误
R: For Loop Copying Error
我正在尝试使用包特定函数 (Red::records) 获取给定物种名称数据框中每个物种的 GPS 坐标信息,该函数从包含物种分布信息的数据库中提取坐标信息。
我的for循环构造如下,其中iterations是nrow(names),函数记录returns lat/long坐标:
for(i in 1:iterations){
gbif[i,1] <- names[i,] ## grab names
try(temp1 <- records(names[i,]))
try(temp1$scientificName <- names[i,])
try(temp2 <- merge(gbif, temp1, by.x="V1", by.y="scientificName"))
datalist[[i]] <- temp2
}
执行这个循环后,我可以获取物种数据;但是,它没有适当地与名单合并。例如,正确调用 records("Agyneta flibuscrocus") returns 5 个独特的 lat/long 坐标,同时调用 records("Agyneta mongolica") 会产生一个错误,找到 0 个记录(这对每个物种都有效在线检查时)。
在此循环之后,我使用以下方法将所有获得的记录绑定到一个数据框中:
dat = do.call(rbind, datalist) ## merge all occurrence data from GBIF into
one data frame
dat <- unique(dat)
当我去验证这个数据框时,我得到了以下示例数据:
Agyneta flibuscrocus -115.58400 49.72
Agyneta flibuscrocus -117.58400 51.299
...
Agyneta mongolica -115.58400 49.72
Agyneta mongolica -117.58400 51.299
这些错误的复制也在其余 200 个名称中重复出现。作为旁注,我将所有内容都包装在 try 语句中,因为如果代码遇到从数据库中产生 0 个结果的记录,代码将不会执行。
我觉得我在这里忽略了一些非常明显的东西?
可重现的数据和代码:
install.packages("red")
library(red)
names = data.frame("Acantheis variatus", "Agyneta flibuscrocus", "Agyneta
mongolica", "Alpaida alticeps", "Alpaide venilliae", "Amaurobius
transversus", "Apochinomma nitidum")
iterations = nrow(names)
datalist = list()
temp1 <- data.frame() ## temporary data frame for joining occurrence data
from GBIF
for(i in 1:iterations){
gbif <- names[i,] ## grab name
try(temp1 <- records(gbif))
try(temp1$V1 <- gbif)
datalist[[i]] <- temp1
}
dat = do.call(rbind, datalist)
我修改了您脚本的某些部分,现在它似乎可以正常工作(使用您的示例数据,该函数仅成功检索一个物种的数据,该物种已在您的代码中复制,但这不是编码问题) .
错误重复的主要原因是变量 temp1
被重用。 try(temp1 <- records(gbif))
失败但 try(temp1$V1 <- gbif)
没有,因为 temp1
和 gbif
都被(错误地)定义了。确保在循环迭代中定义的变量不会转移到下一次迭代。
iterations = nrow(myNames)
datalist = list()
for(i in 1:iterations){
gbif <- myNames[i,] ## grab name
try_result <- try(records(gbif))
if(class(try_result) != "try-error"){
temp1 <- try_result
temp1$V1 <- gbif
datalist[[i]] <- temp1
rm(temp1)
}else{
datalist[[i]] <- NA
}
rm(try_result)
}
dat <- do.call(rbind, datalist[!is.na(datalist)])
我正在尝试使用包特定函数 (Red::records) 获取给定物种名称数据框中每个物种的 GPS 坐标信息,该函数从包含物种分布信息的数据库中提取坐标信息。
我的for循环构造如下,其中iterations是nrow(names),函数记录returns lat/long坐标:
for(i in 1:iterations){
gbif[i,1] <- names[i,] ## grab names
try(temp1 <- records(names[i,]))
try(temp1$scientificName <- names[i,])
try(temp2 <- merge(gbif, temp1, by.x="V1", by.y="scientificName"))
datalist[[i]] <- temp2
}
执行这个循环后,我可以获取物种数据;但是,它没有适当地与名单合并。例如,正确调用 records("Agyneta flibuscrocus") returns 5 个独特的 lat/long 坐标,同时调用 records("Agyneta mongolica") 会产生一个错误,找到 0 个记录(这对每个物种都有效在线检查时)。
在此循环之后,我使用以下方法将所有获得的记录绑定到一个数据框中:
dat = do.call(rbind, datalist) ## merge all occurrence data from GBIF into
one data frame
dat <- unique(dat)
当我去验证这个数据框时,我得到了以下示例数据:
Agyneta flibuscrocus -115.58400 49.72
Agyneta flibuscrocus -117.58400 51.299
...
Agyneta mongolica -115.58400 49.72
Agyneta mongolica -117.58400 51.299
这些错误的复制也在其余 200 个名称中重复出现。作为旁注,我将所有内容都包装在 try 语句中,因为如果代码遇到从数据库中产生 0 个结果的记录,代码将不会执行。
我觉得我在这里忽略了一些非常明显的东西?
可重现的数据和代码:
install.packages("red")
library(red)
names = data.frame("Acantheis variatus", "Agyneta flibuscrocus", "Agyneta
mongolica", "Alpaida alticeps", "Alpaide venilliae", "Amaurobius
transversus", "Apochinomma nitidum")
iterations = nrow(names)
datalist = list()
temp1 <- data.frame() ## temporary data frame for joining occurrence data
from GBIF
for(i in 1:iterations){
gbif <- names[i,] ## grab name
try(temp1 <- records(gbif))
try(temp1$V1 <- gbif)
datalist[[i]] <- temp1
}
dat = do.call(rbind, datalist)
我修改了您脚本的某些部分,现在它似乎可以正常工作(使用您的示例数据,该函数仅成功检索一个物种的数据,该物种已在您的代码中复制,但这不是编码问题) .
错误重复的主要原因是变量 temp1
被重用。 try(temp1 <- records(gbif))
失败但 try(temp1$V1 <- gbif)
没有,因为 temp1
和 gbif
都被(错误地)定义了。确保在循环迭代中定义的变量不会转移到下一次迭代。
iterations = nrow(myNames)
datalist = list()
for(i in 1:iterations){
gbif <- myNames[i,] ## grab name
try_result <- try(records(gbif))
if(class(try_result) != "try-error"){
temp1 <- try_result
temp1$V1 <- gbif
datalist[[i]] <- temp1
rm(temp1)
}else{
datalist[[i]] <- NA
}
rm(try_result)
}
dat <- do.call(rbind, datalist[!is.na(datalist)])