Skip to content

Instantly share code, notes, and snippets.

@mdsumner
Created March 16, 2016 14:42
Show Gist options
  • Save mdsumner/d4bf42ac5b7544f60fdf to your computer and use it in GitHub Desktop.
Save mdsumner/d4bf42ac5b7544f60fdf to your computer and use it in GitHub Desktop.
S3 mutate_ for sp
#' Mutate for Spatial
#'
#' mutate . . .
#'
#' @export
#' @examples
#' library(sp)
#' library(maptools)
#' data(wrld_simpl)
#' library(dplyr)
#' library(spbabel) ## devtools::install_github("mdsumner/spbabel", ref = "pipe")
#' w2 <- wrld_simpl %>% mutate(NAME = "allthesame")
#'
#' ## how to pipe a reprojection? some special formula syntax for ~x+y ?? ~lon+lat ??
mutate_.Spatial_DataFrame <- function(.data, ..., .dots) {
dots <- lazyeval::all_dots(.dots, ..., all_named = TRUE)
pr4 <- proj4string(.data)
dgeom <- sptable(.data)
dat <- as.data.frame(.data)
spFromTable(mutate_(dgeom, .dots = dots), crs = pr4, attr = dat)
}
#' @export
mutate_.SpatialPolygonsDataFrame <- mutate_.Spatial_DataFrame
#' @export
mutate_.SpatialLinesDataFrame <- mutate_.Spatial_DataFrame
#' @export
mutate_.SpatialPointsDataFrame <- mutate_.Spatial_DataFrame
#' @export
mutate_.SpatialMultiPointsDataFrame <- mutate_.Spatial_DataFrame
@hadley
Copy link

hadley commented Mar 16, 2016

I think you can make this simpler in two ways:

  • Dispatch on the Spatial class instead of each subclass individually

  • Write a sptable<- function so you can do

     sptable(.data) <- mutate_(sptable(.data), ..., .dots = .dots)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment