R语言调用lessR包PieChart绘制饼图报条件长度>1错误
报错原因
该报错由lessR包版本迭代后的参数解析逻辑变化导致,和业务代码、数据集本身无关:
- 之前设备上安装的是旧版本lessR,
PieChart函数支持直接在data参数位置传入嵌套生成的临时数据框(即代码中直接通过mutate+as.data.frame动态生成、未提前赋值的临时对象) - 重装环境后安装的新版lessR,在解析
data参数时会先判断传入的对象名是否存在于全局环境的数据框列表中,判断逻辑使用了要求输入单布尔值的if语句;如果直接传入嵌套生成的临时数据,函数解析到的对象名是长度大于1的表达式,无法满足if判断的单值要求,就会抛出the condition has length > 1的错误 - 用公开iris数据集可以稳定复现该问题,也能验证报错和业务数据无关,纯粹是包版本兼容性问题。
解决方法
任选以下一种方案即可修复:
- 方案1(最推荐,符合代码规范):提前完成数据处理,将处理好的数据框赋值给独立变量后再传入
PieChart,不要在函数参数内嵌套写完整的数据处理逻辑。示例修改后的iris测试代码如下:
library(lessR) library(dplyr) # 需提前加载dplyr才能调用mutate、case_when函数 # 提前处理数据并存为独立对象 plot_df <- as.data.frame( mutate(iris, sepal.length.level = case_when(Sepal.Length < 6 ~ "low", Sepal.Length >= 6 ~ "high") ) ) # 传入独立数据对象绘图 PieChart(sepal.length.level, values = "%", color = "white", data = plot_df, fill = c("orange", "green"))
- 方案2:如果不想调整原有代码结构,可以用
I()函数包裹内联生成的临时数据,告诉R直接使用传入的对象、不要做对象名解析,即把data参数部分修改为data = I(as.data.frame(你的数据处理逻辑))即可正常运行。 - 方案3:将lessR包回退到支持内联传入临时数据的旧版本(如4.2.0版本),安装归档版本后原有代码无需修改即可直接运行。
内容的提问来源于stack exchange,提问作者Alexandra
相关产品推荐
相关产品推荐

