基本上我希望能够将数字格式的函数输出保存到 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))
任何帮助将不胜感激!
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
*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