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

发布于 2021-02-09 14:48:37
一个简单的解决方案将是observe的shinyMatrix输入和强制对称性。也就是说,当我们不对称时,用上三角矩阵的值覆盖下三角矩阵。这并不妨碍用户在那里输入值,但一旦用户尝试,就会立即覆盖这些值。
将此观察者添加到服务器:
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,它禁用第三个单元格(按行顺序排列),由您调整代码,以便选择所有较低的三角形元素:
$('.matrix-input-cell').eq(2).off('click')您可以在运行应用程序并在JavaScript控制台中直接发出此命令时尝试这段代码。在Chrome中,您可以通过
右键单击->检查->控制台
您将看到您不能按行顺序单击(从而修改)第3单元格,前提是当然有第3单元格。
要从闪亮的界面中运行这一点,您需要添加一个script元素,例如在UI中:
tags$head(tags$script(type="text/javascript", "$(function() {$('.matrix-input-cell').eq(2).off('click')}"))$(function()位是jQuery代码,一旦加载DOM,它就运行回调函数。
使用当前的方法,这可能会更棘手,因为在加载DOM时不会呈现shinyMatrix元素,因为它是动态的。因此,您需要在您的JavaScript中触发observer代码。library(shinyjs)会是你的朋友。
https://stackoverflow.com/questions/66083711
复制相似问题