R语言合并两个相互依赖的while语句不生效如何解决
问题原因
合并后的代码出现无响应的核心问题有两点:
- 逻辑运算符使用错误:你使用了
&&(逻辑与)作为条件判断的连接符,要求「ticker已被加载为data.frame」和「雅虎接口返回空数据」两个条件同时成立才会进入循环执行校验逻辑。但实际业务需求是只要两个条件任意一个成立,就需要重新输入ticker,应该使用||(逻辑或)作为连接符。 - 变量初始化缺失:合并前你只初始化了
existsTicker变量,还未调用getSymbols.yahoo获取yahooSymbol的值,第一次循环判断时yahooSymbol变量未定义,直接导致判断条件失效,循环不会触发。 - 原代码还存在变量名误用问题:已加载数据集列表赋值给了
loadedDataframes,但提示语中调用了未定义的stripExtension变量,会额外触发报错。
正确合并方案
library(svDialogs) library(quantmod) # 获取全局环境中已加载的data.frame名称 loadedDataframes <- names(which(unlist(eapply(.GlobalEnv,is.data.frame)))) # 首次请求用户输入ticker ticker <- toupper(dlgInput(paste("Enter a ticker (these are already loaded:", toString(loadedDataframes), ")"), "e.g., AAPL")$res) # 初始化两个判断变量 existsTicker <- exists(ticker) yahooSymbol <- getSymbols.yahoo(ticker, env = globalenv()) closeAllConnections() # 只要任意校验不通过就重新输入 while (existsTicker == TRUE || identical(yahooSymbol, character(0)) == TRUE) { # 根据不同错误场景提示用户 if(existsTicker){ prompt_msg <- paste("该ticker已加载,请输入未加载的代码,已加载列表:", toString(loadedDataframes)) } else { prompt_msg <- paste("雅虎金融无该代码数据,请输入有效的ticker,已加载列表:", toString(loadedDataframes)) } # 重新获取输入 ticker <- toupper(dlgInput(prompt_msg, "e.g., AAPL")$res) # 重新校验两个条件 existsTicker <- exists(ticker) yahooSymbol <- getSymbols.yahoo(ticker, env = globalenv()) closeAllConnections() }
内容的提问来源于stack exchange,提问作者pdeli
相关产品推荐
相关产品推荐

