首页 > 解决方案 > lapply in 三点构造函数

问题描述

我正在尝试在用户定义函数的 3 点构造上实现 lapply。不知何故,它不工作。

banner <- function(maintext,..., subtext = NULL) {
  
  if(length(list(...)) > 0) {
    
    dots <- lapply(X = list(...), FUN = function(x) tags$div(x))
    } else {
      dots <-  ''
    }
  
  HTML(paste0(
    
    "<div class='bannerbackground'> <h2>", maintext, "</h2>", 
              
  # If subtext specified
  ifelse(!is.null(subtext), paste0("<span>", subtext, "</span>", dots, "</div>"), paste0(dots, "</div>"))
              
  ))

}

横幅('T1','T2','T3',潜台词 = 'T4')

我期待的输出

<div class='bannerbackground'> <h2>T1</h2><span>T4</span>
<div>T2</div>
<div>T3</div>
</div>

标签: rshinylapply

解决方案


您使用点没有任何问题。您的问题是试图将 html 标签列表传递给paste函数。由于您最终要构建一个字符串,因此需要将它们转换为字符并粘贴为向量,而不是列表。因此,您想要sapply而不是lapply

banner <- function(maintext,..., subtext) {

  dots <- if(length(list(...))) sapply(list(...), function(x) as.character(tags$div(x)))
          else character()
  dots <- paste0("    ", dots, "\n", collapse = "")

  subtext <- if(!missing(subtext)) paste0("    <span>", subtext, "</span>\n") else ""
  
  HTML(paste0("<div class='bannerbackground'>\n  <h2>", 
              maintext, 
              "</h2>\n", 
              subtext, 
              dots, 
              "</div>\n")
      )
}

这给出了格式良好的输出:

banner('T1', 'T2', 'T3', subtext = 'T4')
#> <div class='bannerbackground'>
#>   <h2>T1</h2>
#>     <span>T4</span>
#>     <div>T2</div>
#>     <div>T3</div>
#> </div>

顺便说一句,请注意我已更改is.nullmissing


推荐阅读