创建双参数函数:连续3次获取f()相同值后验证g()返回值
实现你的需求函数
我来帮你搞定这个函数!你的需求逻辑很明确,咱们用基础R就能轻松实现,不用绕dplyr的那些函数(反而会把逻辑搞复杂)。直接看完整代码,再一步步解释:
call_until <- function(f, g) { # 初始化变量,存储最近3次f()的返回值 last_three <- c() while(TRUE) { # 调用一次f(),更新最近三次的记录(始终保留最后3个) current_val <- f() last_three <- c(last_three, current_val) if(length(last_three) > 3) { last_three <- tail(last_three, 3) } # 检查是否连续3次返回相同值 if(length(last_three) == 3 && all(last_three == last_three[1])) { target_val <- last_three[1] # 调用g()并对比结果 g_val <- g() if(g_val == target_val) { return(target_val) } else { # 不匹配的话,重置状态,重新开始循环 last_three <- c() } } } }
代码逻辑解释
- 状态跟踪:用
last_three向量记录最近三次f()的返回值,每次调用f()后更新,确保向量长度最多是3(超过就只保留最后三个)。 - 连续三次相同值判断:当
last_three长度为3,且三个元素完全相同时,就触发下一步调用g()。 - g()匹配逻辑:如果
g()的返回值和之前连续三次的目标值一致,直接返回这个值;如果不一致,就清空last_three,重新开始整个循环流程。
测试示例
咱们写两个模拟函数来测试:
# 模拟f():随机返回1或2,偶尔会连续出3次相同值 sim_f <- function() { sample(c(1,2), 1) } # 模拟g():70%概率返回和目标一致的值,30%不一致 sim_g <- function() { if(runif(1) > 0.3) { sample(c(1,2), 1, prob = c(0.7, 0.3)) } else { sample(c(1,2), 1, prob = c(0.3, 0.7)) } } # 调用测试 result <- call_until(sim_f, sim_g) cat("最终返回值:", result, "\n")
这个测试里,函数会一直调用sim_f()直到连续3次出1或2,然后调用sim_g(),如果匹配就返回,不匹配就重新来。
内容的提问来源于stack exchange,提问作者skatofia
相关产品推荐
相关产品推荐

