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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:48:03