如何根据R中的条件进行函数循环

时间:2018-03-30 11:38:20

标签: r

我原来的功能太复杂了。有一个复杂的计算。所以,我有一个条件,如果满足这个条件,我的函数会停止。这对我来说不利于不必要的计算。因此,我试着在这里给出一个简单的例子,让我的问题清楚。我的原始函数的主要思想是进行一些计算,如果满足给定条件,则函数停止,否则它完成第二次计算。

因此,我编写了一个简单的函数,其中此函数的loop基于特定条件。在我的功能中,我尝试执行以下操作:

  1. 计算前两个乘法。
  2. 如果第二次乘法的值小于第一次,那么,我希望函数停止并返回结果。
  3. 否则,我希望我的函数计算第三个结果。并将其与第二个进行比较。如果第三个结果小于第二个结果然后停止,依此类推我的所有元素。
  4. 这是我的尝试:

    myfun <- function(x,y){
        xy <- list()
        n <- length(x)
        for (i in 1:n){
            xy[[1]] <- x[[1]]*y[[1]]
            xy[[2]] <- x[[2]]*y[[2]]
            if(xy[[2]] < xy[[1]]){
                stop
            }else{
                xy[[i]] <- x[[i]]*y[[i]]
            }
        }
        return(xy)
    }
    x <- rnorm(10, 0,1)
    y <- rnorm(10, 0, 1)
    myres <- myfun(x, y)
    

    我的功能问题是条件只适用于第一个和第二个元素。我想执行3列出的步骤。

    请帮忙吗?

1 个答案:

答案 0 :(得分:2)

尝试写出所有这些条件将是缓慢而痛苦的。您可以创建产品向量,并一次评估其差异是正面还是负面,然后在条件成立时返回产品(如评论中所示):

func <- function(x, y) {
  xy <- x*y
  d.xy <- diff(xy)
  if (all(d.xy > 0)) {
    xy
  } else {
    cat("Product", which(d.xy < 0)[1]+1, "is greater than product", 
                   which(d.xy < 0)[1])
  }
}

set.seed(8)
x <- rnorm(10, 0,1)
y <- rnorm(10, 0, 1)

func(x, y)
#> Product 3 is greater than product 2

x <- 1:10
y <- 2:11
func(x, y)
#>  [1]   2   6  12  20  30  42  56  72  90 110

由于编辑问题而增加的内容

根据您对问题的编辑,这是一个假设计算x和y函数的成本非常耗时的版本:

## assuming time to compute vector of results is v. v. high
func2 <- function(x, y) {
  cval <- x[1] * y[1]
  res <- cval
  for (i in 2:length(x)) {
    res[i] <- x[i] * y[i]
    if (res[i] < cval) {
      break
    }
    cval <- res[i]
  }
  res
}

set.seed(8)
x <- rnorm(10, 0,1)
y <- rnorm(10, 0, 1)

func2(x, y)
#> [1]  0.06426797  0.24543874 -0.19531099

x <- 1:10
y <- 2:11
func2(x, y)
#>  [1]   2   6  12  20  30  42  56  72  90 110

在这个函数版本中,我返回计算结果的值(而不是不返回任何内容),好像花费很长时间来计算它们可能会更好地挂起来以防它们证明有用。