在for循环中构造R中的函数

在for循环中构造R中的函数,r,function,for-loop,R,Function,For Loop,我一直在解决我的代码问题,但我被卡住了。我试图在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){ tMat

我一直在解决我的代码问题,但我被卡住了。我试图在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
}
密度=代表(NA,长度(0,1,by=0.01)) 计数=1 对于(序列中的t(0,1,by=0.01)){ applyThreshold(t、密度、计数) } applyThreshold=函数(t、密度、计数){ tMatrix=corMatrix t矩阵[corMatrix=t]=1 nVector=c() 对于(1中的n:dim(tMatrix)[1]){ nSum=总和(t矩阵[,n]) 如果(nSum==0){ nVector=c(nVector,n) } } 如果(长度(nVector)>0){ tMatrix=tMatrix[,-(nVector)] tMatrix=tMatrix[-(nVector),] } E=总和(t矩阵)/2 V=尺寸(t矩阵)[1] 密度[计数]=2*E/(V*(V-1)) 计数=计数+1 }
但是,在运行此命令结束时,我的密度和计数尚未更新。我有一种感觉,这是一个简单的修复,但我一直在看R中函数的文档,仍然被卡住了。任何建议都将不胜感激

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

在创建函数后尝试运行此命令,以了解我的一些意思:

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

y我之前定义了corMatrix。即使我将coMatrix添加到函数的显式参数中,它也不会改变密度和计数也不会改变的事实。我不认为你所说的关于返回count+1的函数是正确的,因为它不正确!如果我在后面看count,它仍然是1的值。我也尝试了返回(c(计数,密度)),但仍然不起作用。而且,我确实在for循环之前调用了该函数,尽管它是反向编写的。我将在中编辑所有这些内容。谢谢。我所说的关于它返回的内容是正确的。运行我告诉过你的代码片段。如果你想在你的全局环境中改变计数,你必须明确地这样做。你没有。您只更改函数范围内的计数。再次阅读我所说的关于函数中变量的内容。如果您想要更改任何全局变量,则需要显式地进行更改。在这种情况下,尝试使用
Do read about variable scope In R。有很多人会问这个问题。我会删除函数中的前14行代码,设置E=2,V=3,使用seq(0,1,by=0.2)而不是0.01,然后发布你想要的答案。一旦简化后的函数能够正常工作,然后将前14行代码添加回,并尝试使用by=0.01。