【问题标题】:How to condition a part of a function如何调节函数的一部分
【发布时间】:2018-03-08 17:42:36
【问题描述】:

我有这个函数稍后将应用于 3D 数组f3 <- function(x) {-sum((x / sum(x)) * log2(x / sum(x)))},我正在尝试应用条件,如果函数的第二部分是-Inf(即log2(x/sum(x)=-Inf),那么这部分将是0(即log2(x/sum(x))=0)。我正在尝试在函数内嵌套一个 if 语句(见下文)但暂时不起作用。

f3 <- function(x) {
-sum((x / sum(x)) * log2(x / sum(x)))
  if((log2(x/sum(x)))==-Inf) {
log2(x/sum(x))==0
}
}

我在 1000 个 24x24 矩阵 (a) 的 3D 数组上使用这个函数来尝试这个我,我只使用数组 a[,,1] 的第一个矩阵

apply (a[,,1],2,f3)

欢迎任何小提示。 提前致谢。

【问题讨论】:

  • 请记住,=(单等号)是一个赋值运算符,等同于&lt;- 。对于比较,您应该使用==(双等号)
  • 谢谢,我已经正确编辑了问题。我已尝试使用“==”但无法正常工作。
  • 通过提供minimal reproducible example让您的问题更清晰
  • 这是最初的问题以及最终是如何解决的。 stackoverflow.com/q/49116372/9057078

标签: r function multidimensional-array


【解决方案1】:

我相信您正在寻找的东西可以像这样完成:

f3 <- function(x) {
  if(log2(x/sum(x)) == -Inf) {
    result <- 0
  } else {
    result <- -sum((x / sum(x)) * log2(x / sum(x)))
  }
  return(result)
}

【讨论】:

  • 谢谢。我遇到了这些错误:if (log2(x/sum(x)) == -Inf) { 中的错误:需要 TRUE/FALSE 的缺失值另外:警告消息:1:在 if (log2(x/sum(x )) == -Inf) { : 条件长度 > 1 并且只使用第一个元素
  • 当您遇到这些错误时,您能分享您在f3() 中输入的内容吗?
  • apply (a[,,1], 2, f3) ,其中 a 只是 1000 数组的第一个 24x24 矩阵。尝试我只使用 1 个矩阵,然后我将其扩展到所有数组
  • 我明白了。将if 语句更改为if(any(log2(x/sum(x)) == -Inf))
  • 问题是:一个数组不能评估为-Inf,只有它的一个组件可以。在 if 语句中添加 any() 函数将检查数组中是否有任何项的计算结果为 -Inf,如果是,则返回 TRUE
【解决方案2】:

也许这对你有用。只是微小的变化:

f3 <- function(x) {
  denom <- log2(x / sum(x))
  if(denom==-Inf|is.nan(denom)) { denom <- 0}
  -sum((x / sum(x)) * denom)
}

注意:请记住,=(单等号)是等效于 &lt;- 的赋值运算符。对于逻辑比较,您应该使用==(双等号)

【讨论】:

  • 谢谢。我遇到了这些错误:if (log2(x/sum(x)) == -Inf) { 中的错误:需要 TRUE/FALSE 的缺失值另外:警告消息:1:在 if (log2(x/sum(x )) == -Inf) { : 条件长度 > 1 并且只使用第一个元素
  • @shasha 我认为当 x 取值 o 时会产生错误,请尝试在 if 语句中添加额外条件以在 x=0 时正确处理 NaN(请参阅更新)。还记得提供minimal reproducible example,以便我们更好地帮助您。
  • 没关系。这就是问题所在......我将来会添加可重现的示例。现在我想我必须尝试其他解决方案
  • 这是最初的问题,最后是如何解决的stackoverflow.com/q/49116372/9057078
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多