2017-07-03 15 views
0

Ok関数kri3とKmapを1つの関数にしたいと思います。どちらの機能も自分自身で機能します。私が抱えている問題は、2つのkri3を組み合わせると、自分の地球環境で作成した値を保存せずにKmapに渡すということです。このため、Kmapは関数を2つに分割しない限り、値を使用しません。なぜこれを一つの機能にすることができないのですか?私は、この2つではなく、1つの機能だけを持っていたい。2つの関数を1つに変換するR

私が作ろうとしている機能は、地図がx方向とy方向にどれほど鮮明であるかを変数、緯度、経度とします。次に、与えられたデータをクリグし、予測と分散のための2つのヒートマップを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) 
+2

'return 'は3回ではなく、関数ごとに1回発生します。あなたが3つすべてを返すには、それらを 'リスト 'として返す必要があります(そして、後でそのように扱います)。 – r2evans

答えて

0

r2evansが正しくありました。

リターンを3回使用する代わりに、私は1回それを使用する必要がありました。

古いコード:

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

新しいコードは:

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

これは、簡単に私の変数を移動し、一つの関数を作成してみましょう。

関連する問題