Как мне заменить цикл на sapply или применить в функции загрузки пространственных данных из MySQL - PullRequest
0 голосов
/ 02 апреля 2019

Я загружаю данные многоугольника из MySQL в R. Я написал функцию, которая отлично работает.Я надеюсь заменить мой грязный цикл на что-то более быстрое (применить или применить?)

Это для сервера AWS Ubuntu, под управлением MySQL Server 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?Спасибо и извините за неприятный код

1 Ответ

0 голосов
/ 03 апреля 2019

Ваша петля 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...