2014-03-06 208 views
2

我有一个复杂的代码生成一个大的矩阵,但在这里我附上一个简单的,重复的例子,为了解释清楚我想要什么: 下面的代码:插入数字输入的每一行 - R的闪亮

# ui.R 

library(shiny) 
shinyUI(
    mainPanel("Table Output", 
      (tableOutput("My_table"))) 
     ) 

# server.R 

library(shiny) 
shinyServer(function(input, output, session) { 
    My_table = matrix( 
    c(1:100), 
    nrow=20, 
    ncol=5) 
    output$My_table <- renderTable(My_table) 
}) 

我的目标是在表格的左右两侧放一个小文本框,一行为表。 在我的想法中,我需要能够在左边的文本框内写入一个数字,最终也在右边的文本框中,然后根据手动插入的数字对该行进行一些计算。 当然,桌子的长度也会有所不同,所以我需要使用类似dim(My_table)的东西,以便正确地为每行放置一个小文本框,一个放在左侧,一个放在右侧。 我以为使用R闪亮的numericInput函数,但我不知道如何应用在这种情况下的线索。

我可以只用R Shiny函数来做这个,还是我不得不使用html ui.R?

回答

2

您可以将您的矩阵与HTML标记的两个向量(用于数字输入(我的代码下面的input1和input2))的两个向量绑定,并添加sanitize.text.function以按原样评估HTML标记(而不是字符串)。

例如:

shiny::runApp(list(
    ui = basicPage(
    tableOutput("My_table") 
), 
    server = function(input, output, session) { 

    My_table = matrix( 
     c(1:100), 
     nrow=20, 
     ncol=5) 

    output$My_table <- renderTable({ 
     input1 <- paste0("<input id='a", 1:nrow(My_table), "' class='shiny-bound-input' type='number' style='width: 50px;'>") 
     input2 <- paste0("<input id='b", 1:nrow(My_table), "' class='shiny-bound-input' type='number' style='width: 50px;'>") 
     cbind(input1, My_table, input2) 
    }, sanitize.text.function = function(x) x) 

    } 
)) 
+2

感谢您的支持,理解的是,代码会做正是我想要的。现在假设我必须这样做,对于每一行,点击一个按钮后,计算如(input1 * Variable1)+(input2 * Variable2);我必须首先计算,然后将结果放在输出$ My_table中,或者我可以一次完成所有步骤(在输出$ My_table内)? – GrilloRob

+0

真的很好的问题,但我真的不知道如何在这种情况下做到这一点,因为输入是在输出的同时创建的,所以它是复杂的捕获它们而不重新生成输出(隔离不在这里工作)。我可以建议你创建一个新的输出表,例如:输出$ sum < - renderTable({in 1:nrow(My_table)){{ row.sum [i] < - input [[sprintf(“a%d”,i)]] + input [[sprintf(“b%d”,i)]] + sum(My_table [i,]) } data.frame(row.sum) })' –

+0

如何保存在'input1'和'input2'字段中输入的值?我可以将每个'input1'和'input2'字段中的新值保存到一个数据框中的整个表“My_table”吗? – Jay