【问题标题】:Constructing functions in R within a for loop在 for 循环中在 R 中构造函数
【发布时间】:2014-02-23 19:35:05
【问题描述】:

我一直在对代码进行故障排除,但被卡住了。我试图在 R 的 for 循环中重复运行一个函数,同时附加到一个向量。我的代码如下:

densities = rep(NA, length(seq(0, 1, by = 0.01)))
count = 1

for (t in seq(0, 1, by = 0.01)) {
  applyThreshold(t, densities, count)
}

applyThreshold = function(t, densities, count){
  tMatrix = corMatrix
  tMatrix[corMatrix < t] = 0 
  tMatrix[corMatrix >= t] = 1
  nVector = c()
  for (n in 1:dim(tMatrix)[1]){
    nSum = sum(tMatrix[,n])
    if (nSum == 0){
      nVector = c(nVector, n)
    }
  }
  if (length(nVector) >0){
    tMatrix = tMatrix[,-(nVector)]
    tMatrix = tMatrix[-(nVector),] 
  }

  E = sum(tMatrix)/2
  V = dim(tMatrix)[1]
  densities[count] = 2*E/(V*(V-1))
  count = count + 1
}

但是,在运行此命令结束时,我的密度和计数尚未更新。我觉得这是一个简单的修复,但我一直在查看 R 中函数的文档,但仍然卡住了。任何建议将不胜感激!

【问题讨论】:

  • 我会去掉函数中的前14行代码,设置E = 2,V = 3,用seq(0, 1, by = 0.2)代替0.01,把答案贴出来给你想。一旦你让简化的函数正常工作,然后重新添加前 14 行代码并尝试使用 by = 0.01。

标签: r function for-loop


【解决方案1】:

这一切都搞砸了。目前您的函数返回count + 1。这就是它所做的一切。您需要了解不同变量的范围。函数中的所有这些变量仅在调用该函数时存在于该函数中。您需要使用return() 从中获取实际值并将它们存储在单独的变量中。此外,您需要确保在尝试使用它之前已经创建了您的函数。如果按原样运行代码,甚至不会在 for 循环中创建 applyThreshold。

在创建函数后尝试运行它以了解我的意思:

y <- applyThreshold(.5, densities, 5)
print(y)

变量corMatrix 甚至不存在于您的函数中。

【讨论】:

  • 我之前定义了corMatrix。即使我将 coMatrix 添加到函数的显式参数中,它也不会改变密度和计数也不会改变的事实。我不认为你所说的关于我的函数返回 count+1 是正确的,因为它不正确!如果我之后再看 count ,它仍然是 1 的值。我也尝试过 return(c(count, densities)),但它仍然没有用。而且,我确实在 for 循环之前调用了该函数,即使它是颠倒的。我将编辑所有内容。谢谢。
  • 我所说的关于它返回的内容是正确的。运行我告诉你的代码 sn-p。
  • 如果你想在你的全局环境中改变计数,你必须明确地这样做。你没有。您只更改函数范围内的计数。再次阅读我所说的关于函数中的变量的内容。如果您希望更改任何全局变量,则需要明确地进行。在这种情况下,请尝试使用 &lt;&lt;- 代替 =
  • 阅读 R 中的变量作用域。有很多人会问这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2018-10-12
  • 2011-01-31
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多