R Shiny - извлечение антидиагональных элементов в матрице с помощью циклов for - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь создать приложение R Shiny, которое может считывать входные данные матрицы и извлекать антидиагональные элементы, однако я не могу понять, почему коды работают не так, как я хотел.

Ниже приведены примеры кодов:

library(shinyMatrix)
library(shiny)
library(shinydashboard)
library(shinyWidgets)
library(shinyjs)
library(rhandsontable)
library(matrixStats)

ui =
  dashboardPage(
    dashboardHeader(disable = TRUE),
    dashboardSidebar(disable = TRUE),
    dashboardBody(rHandsontableOutput("input1"),
                  br(),
                  rHandsontableOutput("input2"),
                  br(),
                  rHandsontableOutput("results")))


server = function (input, output, session) {

  output$input1 = renderRHandsontable({

    MAT = matrix(as.numeric(''), nrow = 3, ncol = 3,
                 dimnames = list(paste(1:3), paste(1:3)))

    rhandsontable(MAT, width = "100%", height = "100%") %>%
      hot_col(col = c(1:3), valign = 'htCenter', format = "0,0")


  })

  row_input <- reactive({
    req(input$input1)

    my_input_matrix <- as.matrix(hot_to_r(input$input1))
    my_input_row<- as.matrix(hot_to_r(input$input1))

    for(i in 1:3) {

      my_input_row[i] = sum(my_input_matrix[,i])


    }


    row_input = matrix(my_input_row, nrow = 1, ncol = 3,
                        dimnames = list("Rowname", paste(1:3)))
    row_input
  })




  output$input2 <- renderRHandsontable({

    rhandsontable(row_input())

  })


table <- reactive({ 

  my_input_matrix <- as.data.frame(hot_to_r(input$input1))
  my_input_row <- as.data.frame(hot_to_r(input$input2))
  my_table <- as.data.frame(hot_to_r(input$input1),
                            hot_to_r(input$input2))


  for(i in 1:3) {
    for(j in 3:1) {

      my_table[,1] <- my_input_matrix[j,i] 
      my_table[,2] <- my_input_matrix[i,j]

    }
  }


  table = data.frame("A" = my_table[,1],
                     "B" = my_table[,2],
                     stringsAsFactors = FALSE,
                     check.names = FALSE)



  table
})

output$results = renderRHandsontable({

  rhandsontable(table()) 

})

}

shinyApp(ui, server)

Ниже приведены примеры входных и выходных данных:

1-я таблица является входной матрицей

2-я таблица представляет собой однострочную матрица вывода, которая показывает сумму каждого столбца 1-й таблицы (не уверен, что это вызывает проблему, поэтому я просто помещу ее туда)

3-я таблица - это таблица вывода, созданная кодами

enter image description here

Вот проблема, я хочу, чтобы в 3-й таблице были показаны антидиагональные элементы 7-5-3 в столбце A и «обратная антидиагональ» элементы 3-5-7 в столбце B из 1-й таблицы, как показано ниже, вместо приведенных выше (3-3-3- и 7-7-7).

enter image description here

Помогите пожалуйста! Спасибо!

1 Ответ

0 голосов
/ 17 июня 2020

Решил проблему, изменив коды на ниже:

for(i in 1:3) {
    for(j in 3:1) {

      my_table[,1] <- rev(my_input_matrix[i+(j-1)*3])[i] 
      my_table[,2] <- my_input_matrix[i+(j-1)*3][i]

    }
  }

...