如何在R中编写switch语句?

时间:2015-11-19 22:32:20

标签: r geospatial raster

我无法正确编写switch语句。并且可用的示例没有帮助。基本上,语句应该检查单元格中的值是什么(选择:1,2,4,8,16,32,64,128)并基于该行增加/减少行数和列数。一些switch语句有2个计算。

library(raster)
fdr<-raster("fdr.tif")
row1<-50
col1<-50
cell1<-fdr[row1,col1] #The point of origin
switch (cell1,
        4={row2 = row1 + 1
        },
        2={row2 = row1 + 1 & col2 = col1 + 1
        },
        1={col2 = col1 + 1
        },
        128={row2 = row1 - 1 & col2 = col1 + 1
        },
        64={row2 = row1 - 1
        },
        32={row2 = row1 - 1 & col2 = col1 - 1
        },
        16={col2 = col1 - 1
        },
        8={row2 = row1 + 1 & col2 = col1 - 1
        }
)

我也对switch语句以外的技术持开放态度。或任何想让它更快的想法。最后,我将它包装成一个函数,并为每个单元格(像素)执行此操作。

数据:

  1. FDR栅格(小文件):https://www.dropbox.com/s/7o3y8w01y6zqqwm/fdr.tif?dl=0

  2. 概念是水流方向:http://courses.washington.edu/gis250/lessons/hydrology/index.html#coded

1 个答案:

答案 0 :(得分:2)

这就是你编写switch并让它返回行向量的方式,col:

row1 <- 50
col1 <- 50
cell1 <- 16

rowcol <- switch(as.character(cell1),
                 '4' = c(row1 + 1, col1),
                 '2'   = c(row1 + 1, col1 + 1),
                 '1'   = c(row1, col1 + 1),
                 '128' = c(row1 - 1, col1 + 1),
                 '64'  = c(row1 - 1, col1),
                 '32'  = c(row1 - 1, col1 - 1),
                 '16'  = c(row1, col1 - 1),
                 '8'   = c(row1 + 1, col1 - 1))

rowcol

> rowcol
[1] 50 49

您不希望重复对大型栅格的每个元素执行switch;这将是冰川。这是一个矢量化操作,从任何行/列开始并执行单个更新/移动

## generate some dummy raster data
set.seed(1)
m <- matrix(sample(2^(0:7), 9, replace = TRUE), ncol = 3)

## collect row and column indices for raster
dd <- cbind(r = as.vector(row(m)), c = as.vector(col(m)))

## look-up matrix for row and col shifts
lu <- matrix(c( 0,  1,
                1,  1,
                1,  0,
                1, -1,
                0, -1,
               -1, -1,
               -1,  0,
               -1,  1), ncol = 2, byrow = TRUE)
## set rownames with powers of 2 to allow indexing using `m`
rownames(lu) <- 2^(0:7)

## need `m` as a vector
mc <- as.character(as.vector(m))

## which cell to move to next given values of `m`
move <- dd + lu[mc, ]
move

给出了

> move
      r c
 [1,] 2 1
 [2,] 3 1
 [3,] 3 0
 [4,] 0 3
 [5,] 3 3
 [6,] 2 3
 [7,] 0 4
 [8,] 1 2
 [9,] 2 2

根据输入数据,这是正确的。现在你有了进行下一步行动并跟踪事物的问题。在此示例中,移动会将您转移到栅格外的单元格中,用于9个单元格中的3个单元格(rc中的0个单元格,因此如果您将其编入索引m为了在单元格中移动获得2的幂,你只能获得6个值

> m[move]
[1]   4  16  32  32 128   2

因此,当你走路时,你需要跟踪这个,但这应该让你开始。