使用bsplus库链式调用中if语句引发逻辑参数解析错误求助
使用bsplus的bs_carousel时的条件链式调用错误问题
问题描述
原本可正常运行的bs_carousel代码如下:
library(bsplus) library(reactable) bs_carousel("info") %>% bs_set_data(interval = FALSE) %>% bs_append(bs_carousel_image(image1, if(checker1 == 1){reactable(df1[,!(names(df1) %in% c("Day"))])})) %>% bs_append(bs_carousel_image(image2, if(checker2 == 1){reactable(df2[,!(names(df2) %in% c("Day"))])})) %>% bs_append(bs_carousel_image(image3, if(checker3 == 1){reactable(df3[,!(names(df3) %in% c("Day"))])}))
为实现仅当对应数据框行数不为0时才执行bs_append,修改后的代码如下:
bs_carousel("info") %>% bs_set_data(interval = FALSE) %>% if(dim(df1)[1] != 0){bs_append(bs_carousel_image(image1, if(checker1 == 1){reactable(df1[,!(names(df1) %in% c("Day"))])}))} %>% if(dim(df2)[1] != 0){bs_append(bs_carousel_image(image2, if(checker2 == 1){reactable(df2[,!(names(df2) %in% c("Day"))])}))} %>% if(dim(df3)[1] != 0){bs_append(bs_carousel_image(image3, if(checker3 == 1){reactable(df3[,!(names(df3) %in% c("Day"))])}))}
此时触发错误:
Error in if (.) dim(df1)[1] != 0 else { : argument is not interpretable as logical
但将整个bs_carousel代码放入相同条件判断中时可正常运行:
if(dim(df1)[1] != 0){ bs_carousel("info") %>% bs_set_data(interval = FALSE) %>% bs_append(bs_carousel_image(image1, if(checker1 == 1){reactable(df1[,!(names(df1) %in% c("Day"))])})) %>% bs_append(bs_carousel_image(image2, if(checker2 == 1){reactable(df2[,!(names(df2) %in% c("Day"))])})) %>% bs_append(bs_carousel_image(image3, if(checker3 == 1){reactable(df3[,!(names(df3) %in% c("Day"))])}))}
错误原因
管道符%>%的作用是将左侧对象作为第一个参数传递给右侧的函数/表达式。当你在管道后直接使用if语句时,if会把左侧的carousel对象当作第一个参数(即.),但if的第一个参数要求是逻辑值,而非carousel对象,因此触发"无法解释为逻辑值"的错误。
而将整个carousel代码放在if内部时,if的条件是独立的逻辑判断(dim(df1)[1] !=0),管道在if内部正常执行,不会将carousel对象传给if的条件参数,因此运行正常。
解决方案
方案1:分步构建carousel
先初始化carousel,再通过独立的if语句追加内容:
library(bsplus) library(reactable) # 初始化carousel carousel <- bs_carousel("info") %>% bs_set_data(interval = FALSE) # 条件追加df1对应的内容 if (nrow(df1) != 0) { carousel <- carousel %>% bs_append(bs_carousel_image(image1, if(checker1 == 1) reactable(df1[, !names(df1) %in% "Day"]))) } # 条件追加df2对应的内容 if (nrow(df2) != 0) { carousel <- carousel %>% bs_append(bs_carousel_image(image2, if(checker2 == 1) reactable(df2[, !names(df2) %in% "Day"]))) } # 条件追加df3对应的内容 if (nrow(df3) != 0) { carousel <- carousel %>% bs_append(bs_carousel_image(image3, if(checker3 == 1) reactable(df3[, !names(df3) %in% "Day"]))) }
方案2:自定义条件追加函数
通过辅助函数实现管道内的条件追加,保持链式调用风格:
library(bsplus) library(reactable) # 定义条件追加函数 conditional_append <- function(carousel, condition, content) { if (condition) { carousel %>% bs_append(content) } else { # 不满足条件时返回原carousel carousel } } # 链式调用构建carousel bs_carousel("info") %>% bs_set_data(interval = FALSE) %>% conditional_append( condition = nrow(df1) != 0, content = bs_carousel_image(image1, if(checker1 == 1) reactable(df1[, !names(df1) %in% "Day"])) ) %>% conditional_append( condition = nrow(df2) != 0, content = bs_carousel_image(image2, if(checker2 == 1) reactable(df2[, !names(df2) %in% "Day"])) ) %>% conditional_append( condition = nrow(df3) != 0, content = bs_carousel_image(image3, if(checker3 == 1) reactable(df3[, !names(df3) %in% "Day"])) )
测试数据及相关代码
数据框定义
# df1 df1 <- structure(list(Date = structure(c(19305, 19306, 19311, 19319), class = "Date"), Name = c("Green", "Blue18", "Yellow1", "Green14" ), Amount = c(NA_real_, NA_real_, NA_real_, NA_real_), Raised = c(NA_real_, NA_real_, NA_real_, NA_real_), Method = c("Not listed", "Not listed", "Search", "Not listed"), Issue_Type = c("01", "01", "02", "02"), Day = c(9, 10, 15, 23)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame")) # df2 df2 <- structure(list(Date = structure(c(19327, 19332, 19333, 19339), class = "Date"), Name = c("Red", "Blue18", "Blue18", "Green14" ), Amount = c(NA_real_, NA_real_, NA_real_, NA_real_), Raised = c(NA_real_, NA_real_, NA_real_, NA_real_), Method = c("Not listed", "Not listed", "See table below", "Not listed"), Issue_Type = c("03", "02", "02", "01"), Day = c(1, 6, 7, 13)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame")) # df3(空数据框) df3 <- structure(list(Date = structure(numeric(0), class = "Date"), Name = character(0), Amount = numeric(0), Cash_Raised = numeric(0), Method = character(0), Issue_Type = character(0), Day = numeric(0)), row.names = integer(0), class = c("tbl_df", "tbl", "data.frame")) # checker变量 checker1 <- 1 checker2 <- 1 checker3 <- 0
图片获取代码
library(png) library(RCurl) image3 <- readPNG(getURLContent("https://www.eas.org.uk/assets/images/logo-light.png")) image2 <- image3 image1 <- image3
内容的提问来源于stack exchange,提问作者alec22
相关产品推荐
相关产品推荐

