繁体   English   中英

将两个函数转换为一个R

[英]Transforming two functions into one R

好的,我想将我的函数kri3和Kmap合并为一个函数。 这两个功能都由它们自己完成。 我遇到的问题是,当我将两个kri3合并时,将不会保存它在全局环境中创建的值并将其传递给Kmap。 因此,除非将函数拆分为两个,否则Kmap不会使用这些值。 为什么不能将其变成一个功能? 我只想为所有这一切提供一个功能,而不是两个。

我要制作的函数将采用变量,纬度,经度以及地图在x和y方向上的清晰度。 然后它将克里格给定的数据,并一次性输出两个用于预测和方差的热图到ggmap上。

kri3 <- function(var, lat, lon, defx, defy){

  #making a data frame out of the given vectors
  spdf <- data.frame(var,lat,lon)

  #makeing spatial point data frame coords
  sp::coordinates(spdf) <- ~ lon + lat
  bbox <- sp::bbox(spdf)

  #variogram stuff
  lzn.vgm <- gstat::variogram(var ~ 1, spdf)

  lzn.fit1 <- gstat::fit.variogram(lzn.vgm, model = gstat::vgm(1, "Sph", 900, 1))

  lzn.fit = automap::autofitVariogram(var ~ 1,
                                      spdf,
                                      model = c("Sph"),
                                      kappa = c(0.05, seq(0.2, 2, 0.1), 5, 10),
                                      fix.values = c(NA, NA, NA),
                                      start_vals = c(NA,NA,NA),
                                      verbose = T)

  #making our grid
  cs <- c(defx, defy)
  bb <- sp::bbox(spdf)
  cc <- bb[,1] + (cs/2)
  cd <- ceiling(diff(t(bb))/cs)
  gold_grd <- sp::GridTopology(cellcentre.offset = cc, cellsize = cs, cells.dim = cd)
  gold_grd
  p4s <- sp::CRS(sp::proj4string(spdf))
  gold_sg <- sp::SpatialGrid(gold_grd, proj4string = p4s)
  summary(gold_sg)

  #kringing and auto kriging
  lzn.kriged <- as.data.frame(gstat::krige(var ~ 1, spdf, gold_sg , model=lzn.fit1))
  lzn.Akriged <- automap::autoKrige(var ~ 1, spdf, gold_sg)

  lzn.Akriged.pred <- lzn.Akriged$krige_output$var1.pred
  lzn.Akriged.var <- lzn.Akriged$krige_output$var1.var

  return(lzn.kriged)
  return(lzn.Akriged.var)
  return(lzn.Akriged.pred)

}

kriw <- kri3(new_river$E_coli, new_river$lat2, new_river$lon2, 0.005, 0.005)

Kmap <-  function(lat, lon, kriw){

  #making a dataframe for ggplot
  kriw <- as.data.frame(kriw)

  #making a maps
  bbox1 <- ggmap::make_bbox(lon, lat, f = 1.4)
  map <- ggmap::get_map(bbox1)

  #making a heat map
  M1 <- ggmap::ggmap(map) + 
    ggplot2::geom_tile(data = kriw, ggplot2::aes(x = lon,
                                    y = lat, alpha = var1.pred), fill = "red")

  M2 <- ggmap::ggmap(map) + 
    ggplot2::geom_tile(data = kriw, ggplot2::aes(x = lon, 
                                    y = lat, alpha = var1.var), fill = "red")
  #Placing both heat maps together
  heat <- gridExtra::grid.arrange(M1,M2, ncol=2)

  return(heat)

}

Kmap(new_river$lat2, new_river$lon2, kriw)

r2evans是正确的。

而不是使用return 3次,我需要使用一次。

旧代码:

  return(lzn.kriged)
  return(lzn.Akriged.var)
  return(lzn.Akriged.pred)

新代码:

kriw <- data.frame(lzn.kriged, lzn.Akriged.var, lzn.Akriged.pred)
 return(kriw)

这很容易让我移动变量并创建一个函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM