保存包含循环和 ifelse 的函数的输出

问题描述 投票:0回答:1

基本上我希望能够将数字格式的函数输出保存到 R 对象中。该函数包含一个循环和 ifelse 参数,这可能会导致我实现此目标遇到困难。

我想创建一个如下所示的函数:

fnct<-function(x,y) {
    for (i in x) {
ifelse (i>=y[1] & i<=y[2],
y[3],
ifelse (i<y[1],
y[1], ifelse((max(x)-y[2]>y[1]),
y[2],
NA)))
}
}

如果我运行这段代码,什么也不会发生。

fnct(c(1:150),c(20,80,50)) 

如果我通过添加打印参数来修改代码如下,我会得到一个输出:

fnct<-function(x,y) {
    for (i in x) {
ifelse (i>=y[1] & i<=y[2],
print(y[3]),
ifelse (i<y[1],
print(y[1]), ifelse((max(x)-y[2]>y[1]),
print(y[2]),
print(NA))))
}
}

但我无法将其保存到 r 对象。

我还尝试过以下方法:

fnct<-function(x,y) {
res<- matrix(nrow=length(x))
    for (i in x) {
ifelse (i>=y[1] & i<=y[2],
res[i]<-(y[3]),
ifelse (i<y[1],
res[i]<-(y[1]), ifelse((max(x)-y[2]>y[1]),
res[i]<-(y[2]),
res[i]<-(NA))))
}
return(res)
}

在这种情况下有效:

fnct(c(1:150),c(20,80,50)) 

但不是为了这个:

fnct(seq(1.575, 5.125, by = 0.05),c(1.5,3,3.5))

任何帮助将不胜感激!

r function loops if-statement
1个回答
0
投票

1.带有
for
循环。

您必须创建一个向量来保存

ifelse
结果。
另请注意,问题的最后一个
ifelse
不依赖于索引,因此可以预先计算。

fnct <- function(x,y) {
  out <- numeric(length(x))
  pre_comp <- ifelse(max(x) - y[2] > y[1], y[2], NA)
  for (i in seq_along(x)) {
    out[i] <- ifelse (x[i] >= y[1] & x[i] <= y[2],
            y[3],
            ifelse (x[i] < y[1],
                    y[1], pre_comp))
  }
  out
}
fnct(c(1:150),c(20,80,50))
#>   [1] 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 50 50 50 50 50
#>  [26] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
#>  [51] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
#>  [76] 50 50 50 50 50 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
#> [101] 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
#> [126] 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80

创建于 2024-04-12,使用 reprex v2.1.0


2.带有
*apply
循环

使用

*apply
函数的循环变得更简单,无需预先创建结果向量。

fnct <- function(x, y) {
  pre_comp <- ifelse(max(x) - y[2] > y[1], y[2], NA)
  sapply(x, \(xx) {
    ifelse (xx >= y[1] & xx <= y[2],
            y[3],
            ifelse (xx < y[1],
                    y[1], pre_comp))
  })
}
fnct(c(1:150),c(20,80,50))
#>   [1] 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 50 50 50 50 50
#>  [26] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
#>  [51] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
#>  [76] 50 50 50 50 50 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
#> [101] 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
#> [126] 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80

创建于 2024-04-12,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.