[英]How can I replace for loop by sapply or apply in a function loading spatial data from MySQL
我正在 R 中從 MySQL 加載多邊形數據。我編寫了一個可以正常工作的函數。 我希望用更快的東西替換我凌亂的循環(應用或點擊?)
這是針對 AWS ubuntu 服務器,運行 MySQL 服務器 5.7 和 R 編程
# INSTALLING AND LOADING NECESSARY PACKAGES
packages = c("RMySQL","rgeos");
for (package in packages) {
if (package %in% installed.packages()[,"Package"] == FALSE) {
install.packages(package);
}
}
lapply(packages, require, character.only = TRUE)
options(rds = list(
"host" = "avanse-instance.cqzqewynskco.us-east-2.rds.amazonaws.com",
"port" = 3306,
"user" = [user],
"password" = [password]
))
LoadBuildings <- function() {
# Connect to the MySQL database
db <- dbConnect(MySQL(), dbname = "watsan", host = options()$rds$host,
port = options()$rds$port, user = options()$rds$user,
password = options()$rds$password)
# Construct the fetching query
query1 <- paste("SELECT ST_AsText(geom_building) FROM building where zone = 'Charrier_Vertieres_1';")
query2 <- paste("SELECT * FROM building where zone = 'Charrier_Vertieres_1';")
# Submit the fetch query and disconnect
polyg <- dbGetQuery(db, query1)
dt <- dbGetQuery(db, query2)
dbDisconnect(db)
spdf <- SpatialPolygonsDataFrame(readWKT(polyg[1, ]), dt[1, ], match.ID = FALSE)
for (i in 2:nrow(polyg)){
spdf <- rbind(spdf, SpatialPolygonsDataFrame(readWKT(polyg[i, ]), dt[i, ], match.ID = FALSE))
}
return(spdf)
}
是否有其他方法可以解決此問題,例如使用 apply 或 tapply? 感謝並為討厭的代碼感到抱歉
您的for
循環不是任何緩慢的原因。 它正在使用rbind
構建您的數據框,這會減慢您的速度。 嘗試改用這個
spdf <- vector("list", nrow(polyg))
for (i in seq_along(spdf)){
spdf[[i]] <- SpatialPolygonsDataFrame(readWKT(polyg[i, ]), dt[i, ], match.ID = FALSE)
}
spdf <- do.call("rbind", spdf)
或者,您可以使用下一段代碼。 但是我會驚訝地發現性能有很大差異。
spdf <-
lapply(seq_len(nrow(polyg)),
function(i){
SpatialPolygonsDataFrame(readWKT(polyg[i, ]), dt[i, ], match.ID = FALSE)
})
spdf <- do.call("rbind", spdf)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.