2015-11-19 95 views
0

我无法正确编写switch语句。而可用的例子是没有用的。基本上,声明应该检查单元格中的值(选择:1,2,4,8,16,32,64,128)并基于增加/减少行和列的数量。一些switch语句有2个计算。如何在R中编写switch语句?

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 
     } 
) 

我对开关语句以外的其他技术也很开放。或者有任何想法让它更快。最后我会将其包装到一个函数中,并为每个单元格(像素)执行此操作。

数据:

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

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

+0

我认为你需要返回一个向量没有尽管你可以使用'<< - '做到这一点。 –

+0

谢谢。如果你可以提供更多的信息,这将是有益的,我不知道如何继续。 – maximusdooku

+0

我试着用<< - 替换所有=。虽然代码运行没有错误,但我没有看到任何名为col2的输出,row2 – maximusdooku

回答

2

这是你如何编写switch并获得它返回一个行,列的向量:

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以获得单元格中的两个幂次,你只能得到6个值返回

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

因此你需要跟踪这是你走,但是这应该让你开始。

+0

非常感谢!顺便说一句,这是完成这个任务的最快方法,还是我应该考虑替代方案?我会在数千美国国家栅格上做这个。再次感谢。 – maximusdooku

+0

我只是在为矩阵做些什么,而这些矩阵是矢量化的。你*不想做任何事情,除了一个带开关的普通大小的光栅。所以我不会那么快接受;如果你不接受,其他人可能会加入。 –

+0

哦,谢谢!是的,光栅是CO​​NUS范围的。我打算从一个单元“行走”到最下游的单元,方法是将其封装在一个函数中。对a)一个光栅内的所有单元执行相同的操作,b)对所有光栅重复。感谢您的帮助。 – maximusdooku