无法在闪亮的应用程序中的 lapply 函数中使用应用函数

Unable to use apply function inside an lapply function in a shiny app

此代码 returns 每列中的一些响应不适用。

apply(df, 2, function(x) sum(!is.na(x)))

我还制作了一个应用程序,它使用 IRIS 数据集的 'species' 列将其拆分为 3 个部分。然后显示 3 个部分。我们可以真正使用任何数据,并根据某些列将其拆分为多个部分。 但是,我还想计算 3 个数据集中每列中的响应数,但我不确定该怎么做。我尝试了以下及其变体,但我失败了。我想我还需要使用 subset(x,select=-c(Species)) 从数据集中对物种列进行子集化,但我现在真的很困惑我将如何实现这一切。这是我正在进行的项目的最后一个方面,我真的需要一些帮助:-

以下是将数据分成3部分并显示的代码:-

library(shiny) data(iris)
server<- shinyServer(
function(input, output) {
output$data <- renderUI({
  splitDFs<- split(iris, iris$Species)
  lapply(splitDFs, function(x) renderTable(x))
})
} )
ui<- shinyUI(fluidPage( titlePanel(title = h4("Iris Dataset", align="center")), sidebarLayout( sidebarPanel( ),
mainPanel(
  uiOutput("data"),
  
)
)
))
shinyApp(ui = ui, server = server)

以下是我到目前为止尝试过的方法。我尝试了以下代码的各种变体,但都失败了:-

output$data <- renderUI({
            splitDFs<- split(iris, iris$Species)
            lapply(splitDFs, function(x) apply(splitDFs, 2, function(x) sum(!is.na(x)))(x) )

        })

这就是你想要的吗?

lapply(splitDFs, function(y) apply(y, 2, function(x) sum(!is.na(x))))

为清楚起见,更好的想法是将内部 apply 存储为单独的函数:

sum.DF <- function(df) apply(df, 2, function(x) sum(!is.na(x)))
lapply(splitDFs, sum.DF)

VitaminB16 的答案提供了您所需要的,因此您需要弄清楚您想要如何表示它。

例如,如果您在服务器中使用以下代码(稍微调整一下 VitaminB16 的回答):

output$data <- renderUI({
    splitDFs<- split(iris, iris$Species)
    
    sP <- data.frame(t(sapply(splitDFs, function(x) sapply(x, function(y) sum(!is.na(y))))))
    sP <- cbind(data.frame(Metric = rownames(sP)), sP)
    sP2 <- renderTable(sP)
    
    return(list(sP2))
    
  })

你明白了:

在这里,每一行是数据中的一个拆分,每一列是原始数据集中的一列。单元格表示该组合中非缺失值的数量。

  • 拆分功能和以前一样。

  • 然后我们先像Vitamin那样使用nested apply来计算 横截面非 NA 计数。

    • 我们使用 sapply 而不是 lapply 来获得矩阵输出而不是 列出输出,因此我们可以轻松地强制转换为数据帧。
  • 在强制转换之前,我们转置,所以列仍然是列(你可以 如果你愿意,可以试试这个)。

  • 然后,我们将行名称添加为显式列。我们这样做 通过 cbind,否则 Metric 列将位于末尾。

  • 然后,我们将其放入 renderTable 中并传回。

    • 请注意,由于现在只有一个 table,您可以使用 renderTable 并且table直接输出而不用担心renderUI和 uiOutput.