嵌套ifelse语句出现未使用参数错误的技术排查请求
问题原因
你遇到的错误是因为管道操作符%>%的自动参数传递与ifelse的参数逻辑冲突:
- 管道会把前一步的ggplotly对象作为第一个参数传递给后续函数,但
ifelse的第一个参数要求是逻辑判断条件,不是可视化对象。 - 你显式指定了
test=参数,导致管道传递的对象(用.表示)变成了ifelse的未使用参数,从而触发报错。
修复方案
方案1:用标准if-else配合管道代码块
将嵌套ifelse替换为普通if-else语句,并用{}包裹管道内的条件逻辑,明确指定.代表前一步的plot对象:
fPlotPricefloat <- function(mData, dDate, dY, dGroup, dtitle_name, dYLab ,dYmin, dYmax, dBreak, dateBreak, spreadin, size = c("small", "medium", "large")){ # 确保size参数为有效值 size <- match.arg(size) #Define Names in legend dNames <- sort(unique(mData[,dGroup])) ## Define Date interval dateLab <- c("%h%Y") dateBreak <- dateBreak #Define plotb p <- ggplotly(ggplot(data=mData, mapping = aes(x=as.Date(mData[,dDate]), y=mData[,dY], color=mData[,dGroup], text = paste0("<b>Tradedate:, </b>", as.Date(mData[,dDate]),"<br>", paste0("<b>Spread to ", spreadin, ": </b>"), round(mData[,dY],2), "<br>", "<b>AssetID: </b>", mData[,dGroup]), group = 1)) + labs(x=NULL, y=dYLab, title = dtitle_name, caption = "Source: Jyske Bank") + geom_line(size=1) + geom_hline(yintercept = 0) + scale_colour_manual(name="",values=setNames(c(vRGB_Large[1:length(dNames)]),c(dNames[1:length(dNames)]))) + scale_x_date(date_breaks = dateBreak, date_labels = dateLab) + scale_y_continuous(breaks = seq(dYmin, dYmax, by = dBreak)) + theme_bw()+ theme(plot.title=element_text(hjust=0,size=8,face="bold"), plot.caption = element_text(size=6, face = "italic"), axis.text.x = element_text(angle = 90,vjust = 0.01, hjust=1),legend.position = "bottom", legend.title = element_blank(), legend.text=element_text(size=6), legend.key.width = unit(0.5,"cm"), legend.key.height = unit(0.1,"cm"), panel.border = element_blank(), panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank(), axis.line.y = element_line(), axis.title.y = element_text(size = 7), axis.text = element_text(size = 8)), tooltip = "text") %>% layout(legend = list(orientation = "h", x = 0.4, y = -0.2), annotations = list(x = 1, y = -0.3, text = "<b>Source: Jyske Bank</b>", showarrow = F, xref = 'paper', yref = 'paper', xanchor = 'right', yanchor = 'auto', xshift = 0, yshift = 0, font = list(size = 10))) %>% { if (size == "small") { config(., toImageButtonOptions = list(format = "png", width = 601, height = 500)) } else if (size == "medium") { config(., toImageButtonOptions = list(format = "png", width = 1241, height = 750)) } else { config(., toImageButtonOptions = list(format = "png", width = 1698, height = 900)) } } p}
方案2:用switch提前定义配置参数(更简洁)
先根据size选择对应的下载配置,再统一应用到config函数:
fPlotPricefloat <- function(mData, dDate, dY, dGroup, dtitle_name, dYLab ,dYmin, dYmax, dBreak, dateBreak, spreadin, size = c("small", "medium", "large")){ # 确保size参数为有效值 size <- match.arg(size) #Define Names in legend dNames <- sort(unique(mData[,dGroup])) ## Define Date interval dateLab <- c("%h%Y") dateBreak <- dateBreak # 根据size定义下载配置 download_config <- switch(size, small = list(format = "png", width = 601, height = 500), medium = list(format = "png", width = 1241, height = 750), large = list(format = "png", width = 1698, height = 900)) #Define plotb p <- ggplotly(ggplot(data=mData, mapping = aes(x=as.Date(mData[,dDate]), y=mData[,dY], color=mData[,dGroup], text = paste0("<b>Tradedate:, </b>", as.Date(mData[,dDate]),"<br>", paste0("<b>Spread to ", spreadin, ": </b>"), round(mData[,dY],2), "<br>", "<b>AssetID: </b>", mData[,dGroup]), group = 1)) + labs(x=NULL, y=dYLab, title = dtitle_name, caption = "Source: Jyske Bank") + geom_line(size=1) + geom_hline(yintercept = 0) + scale_colour_manual(name="",values=setNames(c(vRGB_Large[1:length(dNames)]),c(dNames[1:length(dNames)]))) + scale_x_date(date_breaks = dateBreak, date_labels = dateLab) + scale_y_continuous(breaks = seq(dYmin, dYmax, by = dBreak)) + theme_bw()+ theme(plot.title=element_text(hjust=0,size=8,face="bold"), plot.caption = element_text(size=6, face = "italic"), axis.text.x = element_text(angle = 90,vjust = 0.01, hjust=1),legend.position = "bottom", legend.title = element_blank(), legend.text=element_text(size=6), legend.key.width = unit(0.5,"cm"), legend.key.height = unit(0.1,"cm"), panel.border = element_blank(), panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank(), axis.line.y = element_line(), axis.title.y = element_text(size = 7), axis.text = element_text(size = 8)), tooltip = "text") %>% layout(legend = list(orientation = "h", x = 0.4, y = -0.2), annotations = list(x = 1, y = -0.3, text = "<b>Source: Jyske Bank</b>", showarrow = F, xref = 'paper', yref = 'paper', xanchor = 'right', yanchor = 'auto', xshift = 0, yshift = 0, font = list(size = 10))) %>% config(toImageButtonOptions = download_config) p}
额外优化建议
- 添加
size <- match.arg(size):确保输入的size只能是指定的三个选项之一,避免无效参数导致的错误。 switch比嵌套ifelse更适合这种多选项的单值判断,代码可读性更高。
内容的提问来源于stack exchange,提问作者Benjamin Bech
相关产品推荐
相关产品推荐

