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

如何在R中编写带循环的交互式问卷函数?

R交互式问卷函数实现方案

核心循环逻辑说明

要实现需求中的交互流程,需要两层循环配合:

  • 外层循环:控制是否继续收集新受访者数据,通过用户输入的Y/N判断循环是否终止
  • 内层验证循环:针对问题2(正整数)和问题3(M/F),反复提问直到输入符合要求

完整函数代码

questionaire <- function() {
  # 初始化空数据框,指定列类型避免类型转换问题
  survey_data <- data.frame(
    Homeland = character(),
    Years = integer(),
    Gender = character(),
    stringsAsFactors = FALSE
  )
  
  # 外层循环:控制是否添加新条目
  continue_entry <- TRUE
  while (continue_entry) {
    # 问题1:无需验证
    homeland <- readline(prompt = "Question 1: Where do you live? ")
    
    # 问题2:验证正整数输入
    years <- NA
    while (TRUE) {
      input <- readline(prompt = "Question 2: For how many years have you been there? ")
      # 尝试转换为整数,同时检查是否为正整数
      years <- suppressWarnings(as.integer(input))
      if (!is.na(years) && years > 0) {
        break
      } else {
        cat("Invalid input! Please enter a positive integer.\n")
      }
    }
    
    # 问题3:验证性别为M/F
    gender <- NA
    while (TRUE) {
      input <- toupper(readline(prompt = "Question 3: What is your gender? (M/F) "))
      if (input %in% c("M", "F")) {
        gender <- input
        break
      } else {
        cat("Invalid input! Please enter 'M' or 'F'.\n")
      }
    }
    
    # 将当前受访者数据加入数据框
    new_row <- data.frame(
      Homeland = homeland,
      Years = years,
      Gender = gender,
      stringsAsFactors = FALSE
    )
    survey_data <- rbind(survey_data, new_row)
    
    # 询问是否添加新条目,验证输入
    while (TRUE) {
      new_entry <- toupper(readline(prompt = "New entry? <Y/N>: "))
      if (new_entry == "N") {
        continue_entry <- FALSE
        break
      } else if (new_entry == "Y") {
        break
      } else {
        cat("Invalid input! Please enter 'Y' or 'N'.\n")
      }
    }
  }
  
  # 输出结果
  cat("\n--- Collected Survey Data ---\n")
  print(survey_data)
  
  # 输出Years的平均值
  avg_years <- mean(survey_data$Years)
  cat(sprintf("\nThe average number of years living in the place is: %.2f\n", avg_years))
  
  # 绘制性别分布饼图
  gender_counts <- table(survey_data$Gender)
  pie(gender_counts, main = "Gender Distribution", col = c("lightblue", "pink"))
}

关键循环细节解释

  1. 外层循环:

    • 用continue_entry作为循环开关,初始为TRUE
    • 当用户输入"N"时,将continue_entry设为FALSE,外层循环终止,进入结果展示环节
  2. 内层验证循环:

    • 问题2:用while(TRUE)无限循环,直到输入能转换为非NA的正整数,才用break跳出
    • 问题3:将输入转为大写后,检查是否属于c("M", "F"),不符合则提示重新输入
    • 新条目确认:同样用循环确保用户仅输入Y/N,避免无效输入导致流程混乱
  3. 数据存储:每次收集完一组答案后,用rbind将新行追加到数据框中,注意初始化时指定列类型,避免后续类型冲突

内容的提问来源于stack exchange,提问作者PowerPoint Trenton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:40:35