Shiny多选条件判断报错:'length(x)=2>1'强制转换为logical(1)
问题解决:Shiny多选下拉框的条件判断警告
警告原因
当使用multiple = TRUE的selectInput时,input$Distribution返回的是字符向量(长度为1或2)。原代码中用distType == "All" && distType == "normal"判断时,&&是标量逻辑运算符,要求左右两侧必须是单个逻辑值,而向量长度大于1时,R会强制将向量转为单个逻辑值,从而触发警告。
正确的判断方式
要判断是否同时选中了"All"和"normal",可以用以下两种可靠方式:
- 检查两个选项是否都包含在选中结果里(推荐,适配选项变更场景):
all(c("All", "normal") %in% distType) - 直接判断选中结果的长度是否为2(仅当选项固定为两个时适用):
length(distType) == 2
修改后的核心代码
将原server部分的if条件替换为正确逻辑即可:
server = function(input,output) { Myclickaction = 'window.open(d.hyperlink, "_blank")' output$net = renderForceNetwork({ distType <- input$Distribution # 替换为正确的判断逻辑 if(all(c("All", "normal") %in% distType)){ fn <- forceNetwork(Links = MisLinks, Nodes = MisNodes, Source = "source", Target = "target", charge = -150, opacityNoHover = 1, Nodesize = "size", Value = "value", NodeID = "name", Group = "group", linkWidth = 2, clickAction = Myclickaction, opacity = 0.9,fontSize = 20, width = 1000,height = 700,linkDistance = JS("function(d){return d.value * 40}"),colourScale =JS("d3.scaleOrdinal(d3.schemeCategory20);"), zoom=TRUE) fn$x$nodes$hyperlink <- MisNodes[["hyperlink"]] fn }else{ MyClickScript <-'window.open("http://localhost:9191/"+ d.name, "_blank");' forceNetwork(Links = mislink, Nodes = misnod, Source = "source", Target = "target", Value = "value", NodeID = "name",Nodesize = "size", Group = "group", opacity = 1, zoom = T,opacityNoHover = TRUE, fontSize = 20, width = 1000,height = 700, bounded = TRUE, clickAction = MyClickScript,linkDistance =100) } }) }
补充说明
如果之前尝试用all函数但未解决问题,大概率是写法错误——比如写成了all(distType == "All" && distType == "normal"),这种写法依然先执行了标量判断distType == "All" && distType == "normal",会触发同样的警告。正确逻辑是先检查每个目标值是否在选中向量中,再用all确认全部满足。
内容的提问来源于stack exchange,提问作者kumari sinam
相关产品推荐
相关产品推荐

