我希望能够基于将一列与另一列分开来计算新的数据列,其中两个原始列都由用户输入选择。我想将这些计算数据加入原始表(或其副本)。
我已经设法弄清楚如何制作一个对列输入选择作出反应的数据帧,并且我设法进行了将一列除以另一列的计算,但是我无法制作最终的数据帧。包括所有原始列以及新计算的列。
这是我使用内置的Iris数据进行的模拟。它显示第一个表中所选列的数据,以及第二个表中的计算(您需要向下滚动很远才能看到这个)。
如何将此计算数据加入原始来源?
非常感谢
#Ui
pageWithSidebar(
headerPanel('Calculate Column'),
sidebarPanel(
#select variables from iris dataset
selectInput('xcol', 'X Variable', names(iris)),
selectInput('ycol', 'Y Variable', names(iris),
selected=names(iris)[[2]])
),
mainPanel(
#display the selected variables
tableOutput("view"),
#display the calculated variable
tableOutput("view2")
)
)
#Server
function(input, output, session) {
# Combine the selected input variables into a new data frame
selectedData <- reactive({
iris[, c(input$xcol, input$ycol),]
})
# divide one variable selection by the other
selectedData2 <- reactive({
iris$new<-iris[, c(input$xcol)]/iris[, c(input$ycol)]
})
# create data output for selected variables
output$view <- renderTable({selectedData()
})
# create data output for calculated variable
output$view2 <- renderTable({selectedData2()
})
}
答案 0 :(得分:4)
您忘了iris
不是反应元素,因此您的代码无法正常工作。你有两个选择:
reactive()
创建一个反应值来存储该数据框。reactiveValues()
存储更新数据框的反应值。 使用reactiveValues
,您可以列出与input
和output
非常相似的反应式表达式。在下面的示例中,我使用它将数据框iris
存储为globals$mydf
。然后,您可以使用例如observe
来反应更改值,如以下服务器函数所示:
#Server
server <- function(input, output, session) {
globals <- reactiveValues(
mydf = iris
)
observe({
thedf <- globals$mydf
newvar <- thedf[[input$xcol]] / thedf[[input$ycol]]
globals$mydf$ratio <- newvar
})
# create data output for selected variables
output$view <- renderTable({
globals$mydf
})
}
你可以制作两个相互依赖的反应式表达式:
您的服务器将如下所示:
server <- function(input, output, session) {
newdf <- reactive({
cbind(
iris[c(input$xcol, input$ycol)],
Ratio = newvar()
)
})
newvar <- reactive({
iris[[input$xcol]] / iris[[input$ycol]]
})
# create data output for selected variables
output$view <- renderTable({
newdf()
})
}
虽然您认为这不是您正在寻找的内容,但您可以在其他代码中使用newdf()
,就像在上一个示例中使用globals$mydf
一样。 reactiveValues()
如果您的代码的不同部分必须能够更改数据框,则会获得回报。
答案 1 :(得分:0)
reactive
selectedData2
你只是做一个增量<-
,你不会返回任何内容,我认为你应该这样做:
function(input, output, session) {
# Combine the selected input variables into a new data frame
selectedData <- reactive({
return(iris[, c(input$xcol, input$ycol),])
})
# divide one variable selection by the other
selectedData2 <- reactive({
new<-iris[, c(input$xcol)]/iris[, c(input$ycol)]
return(new)
})
# create data output for selected variables
output$view <- renderTable({selectedData()
})
# create data output for calculated variable
output$view2 <- renderTable({selectedData2()
})
}