You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建双参数函数:连续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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:34:36