首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建上三角矩阵/表,从R闪亮的用户中收集相关系数。

创建上三角矩阵/表,从R闪亮的用户中收集相关系数。
EN

Stack Overflow用户
提问于 2021-02-07 01:31:45
回答 1查看 403关注 0票数 1

我正在创建一个上三角矩阵,让用户输入相关因变量(例如,不同性状)之间的相关系数。我能够使用r包shinyMatrix实现这一点(见屏幕截图)。然而,这个包只支持整个矩阵,而不支持上三角矩阵。我暂时把一个NA放在下三角部分,但是用户仍然可以删除NA并在这里输入任何数字。我考虑过使用numericInput,但无法找到解决方案,因为输入矩阵的维度和列/行名称是反应性的(取决于用户&它看起来不如矩阵输入那样好)。我的问题是如何创建一个反应的上三角矩阵(例如,使用click阻止下三角元素的Javascript)?如果这不适用,是否可以使用shinyMatrix将所有较低的三角形元素固定为"NA“(用户不能更改)?欢迎并感谢您的任何建议!

下面的是一个小示例代码:

代码语言:javascript
运行
复制
library(shiny)
library(shinyMatrix)

ui <- basicPage(
  fluidRow(column(6,
           numericInput("ntrait", "Number of traits", value = 1,
                        min = 1))),
  fluidRow(column(6, style='padding:0px;', 
                  wellPanel(uiOutput("TPhenocor"))))
)

server <- shinyServer(function(input, output, session){
  output$TPhenocor <- renderUI({
    num <- as.integer(input$ntrait)
    dmat <- diag(num)
    dmat[lower.tri(dmat)] <- NA
    switch(num>1,
           matrixInput(
             inputId = "ycor",
             label = "Correlation coefficients matrix",
             value = dmat,
             class = "character",
             cols = list(names = FALSE), 
             rows = list(names = FALSE)), NULL)
  })
})

shinyApp(ui = ui, server = server)

更新:I能够创建上三角形矩阵,并且仅使用R代码就可以限制对角线和下三角形的变化(参见下文)。如果有人需要的话,我可以分享一个演示。

EN

回答 1

Stack Overflow用户

发布于 2021-02-09 14:48:37

一个简单的解决方案将是observeshinyMatrix输入和强制对称性。也就是说,当我们不对称时,用上三角矩阵的值覆盖下三角矩阵。这并不妨碍用户在那里输入值,但一旦用户尝试,就会立即覆盖这些值。

将此观察者添加到服务器:

代码语言:javascript
运行
复制
observeEvent(input$ycor, {
   mat <- input$ycor
   req(!isSymmetric(mat)) 
   ## fires only if we are not symmetrical otherwise we would end up in an infinite loop
   mat[lower.tri(mat)] <- mat[upper.tri(mat)]
   updateMatrixInput(session, "ycor", mat)
}) 

另一种解决方案是使用Javascript从下三角矩阵中删除所有click事件。这样,用户就不能在那里输入值。

您可以使用以下jQuery,它禁用第三个单元格(按行顺序排列),由您调整代码,以便选择所有较低的三角形元素:

代码语言:javascript
运行
复制
$('.matrix-input-cell').eq(2).off('click')

您可以在运行应用程序并在JavaScript控制台中直接发出此命令时尝试这段代码。在Chrome中,您可以通过

右键单击->检查->控制台

您将看到您不能按行顺序单击(从而修改)第3单元格,前提是当然有第3单元格。

要从闪亮的界面中运行这一点,您需要添加一个script元素,例如在UI中:

代码语言:javascript
运行
复制
tags$head(tags$script(type="text/javascript", "$(function() {$('.matrix-input-cell').eq(2).off('click')}"))

$(function()位是jQuery代码,一旦加载DOM,它就运行回调函数。

使用当前的方法,这可能会更棘手,因为在加载DOM时不会呈现shinyMatrix元素,因为它是动态的。因此,您需要在您的JavaScript中触发observer代码。library(shinyjs)会是你的朋友。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66083711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档