R:运行一个函数,直到对函数的上一个输出的条件测试对所有行都为真

R:运行一个函数,直到对函数的上一个输出的条件测试对所有行都为真,r,tidyverse,R,Tidyverse,我试图在R中编写一个脚本,重复一个条件测试或函数,直到所有值都满足该条件。我可以通过复制和粘贴来实现这一点,但正如我们所知,这将变得很麻烦更新我早些时候用虚构的数据和虚构的条件发布了这篇文章,但遗憾的是,我无法弄清楚它-这是真实的情况:我正在尝试调整一行中多个点之间的坡度,以创建满足小于0.02条件的平滑行 # initial info: NS_max_slope <- 0.02 #NS = North-South slope. These values are positive. So

我试图在R中编写一个脚本,重复一个条件测试或函数,直到所有值都满足该条件。我可以通过复制和粘贴来实现这一点,但正如我们所知,这将变得很麻烦更新我早些时候用虚构的数据和虚构的条件发布了这篇文章,但遗憾的是,我无法弄清楚它-这是真实的情况:我正在尝试调整一行中多个点之间的坡度,以创建满足小于0.02条件的平滑行

# initial info:

NS_max_slope <- 0.02
#NS = North-South slope. These values are positive. South-North slopes are negative. We're only checking NS slopes with this.

#the data
        Z   LF_IN_1 old_z_1 NS_slope    include
1   285.2573    NA  NA  NA  NA
2   285.2283    16.4147 285.2573    -0.001766709    -0.001766709
3   285.154 24.3543 285.2283    -0.003050796    -0.003050796
4   285.0791    24.3543 285.154 -0.003075432    -0.003075432
5   283 24.3544 285.0791    -0.085368558    -0.085368558
6   284.8716    19.0761 283 0.098112298 0.098112298
7   284.8364    19.0761 284.8716    -0.001845241    -0.001845241
8   284.788 24.3543 284.8364    -0.001987329    -0.001987329
9   284.7599    24.3544 284.788 -0.001153796    -0.001153796
10  284.9187    24.3543 284.7599    0.006520409 0.006520409
11  285 16.4147 284.9187    0.004952878 0.004952878
12  280 215.3846194 285 -0.023214285    NA

#初始信息:

NS_max_slopeRecursion
rowwise
可以工作:

recursive_if <- function(x) {
  if (x<0) {
    cat(x,' ')
    recursive_if(x+0.25)
  } else {
    cat('done \n')
    NA
 }
}


df_1 <- df %>% rowwise() %>% mutate(test_1 = recursive_if(x))

#done 
#-1.324969  -1.074969  -0.8249694  -0.5749694  -0.3249694  -0.07496937  done 
#done 
#-0.2456965  done 
#-1.611627  -1.361627  -1.111627  -0.8616274  -0.6116274  -0.3616274  -0.1116274  done 
#-0.6212984  -0.3712984  -0.1212984  done 
#-0.7625072  -0.5125072  -0.2625072  -0.01250716  done 
#-1.480466  -1.230466  -0.9804658  -0.7304658  -0.4804658  -0.2304658  done 
#done 
#-0.8605357  -0.6105357  -0.3605357  -0.1105357  done
#...

df_1

       x test_1
    <dbl> <lgl> 
 1  0.777 NA    
 2 -1.32  NA    
 3  1.05  NA    
 4 -0.246 NA    
 5 -1.61  NA    
 6 -0.621 NA    
 7 -0.763 NA    
 8 -1.48  NA    
 9  0.815 NA    
10 -0.861 NA 
...
recursive\u如果为什么不:

df <- data.frame(x = rnorm(20))

while(any(df < 0)) {
  cond <- df < 0
  df[cond] <- df[cond] + 0.25
  df[!cond] <- 1
}
df[df > 0] <- NA

df那么如果最后都是
NA
,你想从中得到什么值?好问题-这不是我的实际函数或条件测试,我的实际目标不是让每个值都高于零。我简化了一切,试图引出一个根本问题,即重新应用一个函数直到满足一个条件。你测试过它吗?至少在我这方面不起作用。嗨@Waldi谢谢你的回答。我试着把这个应用到我的“真实”剧本中,但没能弄明白。我将问题更新为“真实”信息。谢谢
elev_adjust <- function(data) {
    
    ## slope check for fail
    
    slope_check_df <- data %>% 
        mutate(slope_fail = slope_check(slope = include))
    
    # slope adjust

    iteration_1 <- slope_check_df %>% mutate(elev_adjust_1 = elev_adj(data = slope_check_df),
                                             elev_adjust_lag_1 = lag(elev_adjust_1),
                                             slope_adj_1 = (elev_adjust_1 - elev_adjust_lag_1) / LF_IN_1, 
                                             slope_check_1 = slope_check(slope_adj_1))
    
    iteration_1
}
recursive_if <- function(x) {
  if (x<0) {
    cat(x,' ')
    recursive_if(x+0.25)
  } else {
    cat('done \n')
    NA
 }
}


df_1 <- df %>% rowwise() %>% mutate(test_1 = recursive_if(x))

#done 
#-1.324969  -1.074969  -0.8249694  -0.5749694  -0.3249694  -0.07496937  done 
#done 
#-0.2456965  done 
#-1.611627  -1.361627  -1.111627  -0.8616274  -0.6116274  -0.3616274  -0.1116274  done 
#-0.6212984  -0.3712984  -0.1212984  done 
#-0.7625072  -0.5125072  -0.2625072  -0.01250716  done 
#-1.480466  -1.230466  -0.9804658  -0.7304658  -0.4804658  -0.2304658  done 
#done 
#-0.8605357  -0.6105357  -0.3605357  -0.1105357  done
#...

df_1

       x test_1
    <dbl> <lgl> 
 1  0.777 NA    
 2 -1.32  NA    
 3  1.05  NA    
 4 -0.246 NA    
 5 -1.61  NA    
 6 -0.621 NA    
 7 -0.763 NA    
 8 -1.48  NA    
 9  0.815 NA    
10 -0.861 NA 
...
df <- data.frame(x = rnorm(20))

while(any(df < 0)) {
  cond <- df < 0
  df[cond] <- df[cond] + 0.25
  df[!cond] <- 1
}
df[df > 0] <- NA