这还不是一个实际问题,而是一个理论问题。我正在考虑使用 Shiny 以交互方式显示一些原始数据。这可以。
但是 - 是否可以让用户更改显示的数据?
假设我有一堆 slider 供用户限制基础数据以满足某些条件并显示这些观察结果 - 是否可以允许用户对该数据进行修改并将这些修改发送回服务器,这反过来保存这些更改?
我正在考虑用户可能使用 Shiny Application 浏览数据并检测数据中潜在异常值的场景——然后用户可以将这些标记为异常值。但是,该信息需要传回服务器。
这样的应用可能吗?有一些现有的例子吗?
最佳答案
我一直在研究使用此工作流程的软件包:
这不是使用 Shiny 的常用方式 - 该应用程序不是远程部署的,而是在本地用作单个用户的交互式绘图界面。我用基本图形和
locator()
做了类似的事情。功能,很繁琐。使用 tcl/tk 可能更容易,但我很想知道它如何与 Shiny 一起工作。这是一个玩具示例:
myShiny <- function(mydata){
ui <- fluidPage(
actionButton("exit", label = "Return to R"),
plotOutput("dataPlot", click = "pointPicker")
)
server <- function(input, output){
output$dataPlot <- renderPlot({
plot(x = myData()[, 1], y = myData()[,2], cex = myData()[,3])
})
myData <- reactive({
selPts <- nearPoints(mydata,
input$pointPicker, "x", "y",
threshold = 25, maxpoints = 1, allRows = TRUE)
if(sum(selPts[,"selected_"]) > 0){
## use '<<-' to modify mydata in the parent environment, not the
## local copy
mydata[which(selPts[, "selected_", ]), "size"] <<-
mydata[which(selPts[, "selected_", ]), "size"] + 1
}
mydata
})
observe({
if(input$exit > 0)
stopApp()
})
}
runApp(shinyApp(ui = ui, server = server))
return(mydata)
}
testDF <- data.frame(x = seq(0, 2 * pi, length = 13),
y = sin(seq(0, 2 * pi, length = 13)),
size = rep(1, 13))
modDF <- myShiny(testDF)
在这种情况下,单击一个点会增加相应行中的一列(“大小”)的值(在绘制时使用
cex
参数可视化)。这些值返回给用户,在这种情况下,存储在 modDF
中。多变的:> modDF
x y size
1 0.0000000 0.000000e+00 1
2 0.5235988 5.000000e-01 5
3 1.0471976 8.660254e-01 1
4 1.5707963 1.000000e+00 1
5 2.0943951 8.660254e-01 2
6 2.6179939 5.000000e-01 1
7 3.1415927 1.224647e-16 1
8 3.6651914 -5.000000e-01 7
9 4.1887902 -8.660254e-01 1
10 4.7123890 -1.000000e+00 1
11 5.2359878 -8.660254e-01 3
12 5.7595865 -5.000000e-01 1
13 6.2831853 -2.449294e-16 1
很容易修改它以切换“异常值”列中的值(以便您可以扭转您的决定),或者直接在数据框中进行永久性更改。
在我的实际包中,我使用这种方法允许用户直观地选择非线性回归的初始参数,立即看到在浏览器中绘制的结果模型拟合,重复直到他们得到一个看起来合理的拟合模型,最后保存结果并返回到他们的 R session 。
关于r - 允许用户修改数据的 Shiny R 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17263627/