【问题标题】:R: error in function that uses raster packageR:使用光栅包的函数出错
【发布时间】:2015-06-09 13:27:50
【问题描述】:

我有光栅图像,我想应用一个函数,该函数将根据相邻单元格的值给出一个值。在以该单元格为中心的 3x3 窗口中,我想给一个单元格一个介于 0 和 8/8(=1)之间的值,具体取决于多少个单元格(来自该窗口中的其他 8 个单元格)。例如,如果其他 5 个单元格的值与中心单元格不同,则函数必须在该单元格中分配 5/8。 我正在尝试使用光栅包中的焦点来做到这一点。

首先,我编写了一个处理 3x3 窗口的函数:

    mix<-function(a, na.rm=TRUE){
  v==0
  b=a[2:2]
  if (!(a[1:1]=b)) {
    if (!is.na(a[1:1])){v=v+1}else v=v
  }
   if(!(a[1:2]=b)){if (!is.na(a[1:2])){v=v+1}else v=v}
    if(!(a[1:3]=b)){if (!is.na(a[1:3])){v=v+1}else v=v}
     if(!(a[2:1]=b)){if (!is.na(a[2:1])){v=v+1}else v=v}
      if(!(a[2:3]=b)){if (!is.na(a[2:3])){v=v+1}else v=v}
       if(!(a[3:1]=b)){if (!is.na(a[3:1])){v=v+1}else v=v}
        if(!(a[3:2]=b)){if (!is.na(a[3:2])){v=v+1}else v=v}
         if(!(a[3:1]=b)){if (!is.na(a[3:3])){v=v+1}else v=v}
  v
}

然后我尝试像这样使用焦点:

r2

但是:“混合错误(w):找不到对象'v'”

我认为我遗漏了一些东西,也许方法不正确。

任何帮助将不胜感激。

提前致谢 约翰

【问题讨论】:

  • 也许分配v==0 应该是v &lt;- 0 并与== 比较
  • 也许 R 中的冒号运算符不符合您的期望。见?":"
  • 谢谢。 v
  • 我取得了一些进展,我会写一个答案,但不是一个完整的答案

标签: r image r-raster


【解决方案1】:

我终于解决了我的问题 我像这样更正混合功能:

mix<-function(a, na.rm=TRUE){
  v<-0
  b=a[5]
  if (!(a[1]==b)) {if (!(a[1]==0)){v=v+1}else v=v}
   if(!(a[2]==b)){if (!(a[2]==0)){v=v+1}else v=v}
    if(!(a[3]==b)){if (!(a[3]==0)){v=v+1}else v=v}
     if(!(a[4]==b)){if (!(a[4])==0){v=v+1}else v=v}
      if(!(a[6]==b)){if (!(a[6])==0){v=v+1}else v=v}
       if(!(a[7]==b)){if (!(a[7])==0){v=v+1}else v=v}
        if(!(a[8]==b)){if (!(a[8])==0){v=v+1}else v=v}
         if(!(a[9]==b)){if (!(a[9])==0){v=v+1}else v=v}         
  v/8
}

现在 mix 功能可以正常工作了。 用焦点做例子似乎焦点使用了应用窗口中的数字向量。所以它应该可以正常工作。我还在一个 10x10 的栅格中进行了测试,效果很好

我将其标记为已回答。

祝你有美好的一天

【讨论】:

    【解决方案2】:

    在 R 中,您可以对向量执行基本操作:

    mix2<-function(a, na.rm = TRUE){
      b <- a[5]
      a <- a[-5]
      mean(ifelse(a != b & a != 0, 1, 0), na.rm = na.rm)
    }
    

    【讨论】:

    • 你在这里并不需要ifelse,因为如果你将它们用于 sum、mean、... 这样你就可以做 @987654323 @
    【解决方案3】:

    这是一个糟糕的功能,难以阅读,效率低下。 Bergant 展示了一个更好的选择,这是另一个变体。

    mix2 <- function(a, ...){
       i <- a[5] != a
       mean(i[-5], na.rm=TRUE)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2023-01-20
      • 2014-08-29
      • 2011-08-01
      • 2018-03-31
      • 1970-01-01
      相关资源
      最近更新 更多