如何在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")) }
关键循环细节解释
外层循环:
- 用
continue_entry作为循环开关,初始为TRUE - 当用户输入"N"时,将
continue_entry设为FALSE,外层循环终止,进入结果展示环节
- 用
内层验证循环:
- 问题2:用
while(TRUE)无限循环,直到输入能转换为非NA的正整数,才用break跳出 - 问题3:将输入转为大写后,检查是否属于
c("M", "F"),不符合则提示重新输入 - 新条目确认:同样用循环确保用户仅输入Y/N,避免无效输入导致流程混乱
- 问题2:用
数据存储:每次收集完一组答案后,用
rbind将新行追加到数据框中,注意初始化时指定列类型,避免后续类型冲突
内容的提问来源于stack exchange,提问作者PowerPoint Trenton
相关产品推荐
相关产品推荐

