我想制作一个Shiny App,用户可以按下一个动作按钮,然后在服务器端触发一些代码,在www文件夹中创建一个文件,然后打开/下载该文件.
假设文件是test.txt(在我的例子中,它将是各种R,Excel和exe文件,它们将从驱动器上的不同文件夹复制到www文件夹).
我的第一次尝试是使用带有onclick选项的actionbutton,如下所示
ui <- fluidPage(
actionButton("showtxt", "Show/Download File", onclick = "window.open('test.txt')")
)
server <- function(input, output, session){
observeEvent(input$showtxt,{
# Write some text
write.table(c("Test"), file = "www/test.txt")
})
}
shinyApp(ui=ui,server=server)
Run Code Online (Sandbox Code Playgroud)
但是这不起作用,因为onclick动作是在评估observevent之前完成的.
然后我尝试在onclick选项中调用一个函数,如下所示
CreateFileAndLink <- function(){
write.table(c("Test"), file = "www/test.txt")
return("window.open('test.txt')")
}
ui <- fluidPage(
actionButton("showtxt", "Show/Download File", onclick = CreateFileAndLink())
)
server <- function(input, output, session){}
shinyApp(ui=ui,server=server)
Run Code Online (Sandbox Code Playgroud)
这有效,但有一个缺点,现在文件是在打开Shiny App时创建的,而不是在用户单击action按钮时创建文件.如果我在具有相对较大文件的应用程序中多次使用这段代码,这是非常低效的.
也许可以确保在onclick-action之前执行observevent,或者可以使用服务器端的onclick选项.
任何帮助将不胜感激!
干杯
更新:
我发现Dean Attali 的伟大的shinyjs包含了一个onclick功能,可能在这里有所帮助.我试着运行下面的代码,但它不起作用:/
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
actionButton("showtxt", "Show/Download File")
)
server <- …Run Code Online (Sandbox Code Playgroud) 我正在使用 R DT 包制作数据表。我希望用户能够决定/控制是否查看数据中的 24、48、72、96 行或所有行。
这可以通过设置轻松完成:
lengthMenu = c(24,48, 72, 96, -1),
Run Code Online (Sandbox Code Playgroud)
在选项列表中,其中-1代表所有条目。
问题是用户可能不知道 -1 代表什么,因此我想让它在用户可见的菜单中显示为字符串“All”。
通过查看lengthMenu 的文档,我发现这可以通过编写来完成
$('#example').dataTable( {
"lengthMenu": [ [10, 25, 50, -1], [10, 25, 50, "All"] ]
} );
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将其翻译成 R 语言。我尝试过使用命名列表、向量和数组,但都没有成功。
下面是一个简单的例子:
library(shiny)
library(DT)
ui <- fluidPage(
DT::dataTableOutput("table")
)
server <- function(input, output) {
output$table <- DT::renderDataTable({
DT::datatable(iris, options = list(pageLength = 24,
lengthMenu = c(24,48, 72, 96, -1), paging = T))
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!
谢谢
我试图找到一种方法来检查 Shiny Dashboard Box 是折叠还是展开。
通过阅读@daattali 在如何在闪亮的仪表板中手动折叠框的精彩回复,我知道可以使用 Shinyjs 包从服务器端折叠框,如下面的代码所示
library(shiny)
library(shinydashboard)
library(shinyjs)
jscode <- "
shinyjs.collapse = function(boxid) {
$('#' + boxid).closest('.box').find('[data-widget=collapse]').click();
}
"
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody(
useShinyjs(),
extendShinyjs(text = jscode),
actionButton("bt1", "Collapse box1"),
actionButton("bt2", "Collapse box2"),
br(), br(),
box(id = "box1", collapsible = TRUE, p("Box 1")),
box(id = "box2", collapsible = TRUE, p("Box 2"))
)
)
server <- function(input, output) {
observeEvent(input$bt1, {
js$collapse("box1")
})
observeEvent(input$bt2, {
js$collapse("box2")
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
通过检查 UI …