所以我正在尝试创建一个闪亮的应用程序,我有一个按钮,只显示文件已上传; 为此我使用conditionalPanel.
ui.R:
require(shiny)
shinyUI(pageWithSidebar(
headerPanel("My App"),
sidebarPanel(
fileInput("files", "Choose file"),
conditionalPanel(
condition = "input.files",
actionButton("submitFiles", "Submit files for processing"))),
mainPanel(h3("Nothing to see here"))
))
Run Code Online (Sandbox Code Playgroud)
我不认为我的服务器中有任何需要关心的内容.因为上面的例子没有做任何事情.在上述条件下,按钮从不显示,即条件永远不会出现.
我为我的条件尝试过的一些事情是input.files.length > 0,在我上传文件之前input.files.size() > 0,这两个因素都会导致按钮出现.我猜这是因为在选择文件之前输入$ files是一个空的data.frame,因此长度/大小非零,是吗?
在完成上传至少一个文件之前,我可以使用什么条件隐藏按钮?
我认为,另一种选择是,以取代conditionalPanel用uiOutput,并呼吁renderUI({actionButton(...)})在server.R的观察/分离块,是看input.files(内if (nrow(input$files) < 1) return()); 这是唯一的方法吗?如果我能以这种方式做到这一点,是什么让我选择其中一个(除了conditionalPanel导致更少的代码)?
在写一个依赖的包时data.table,我发现了一些奇怪的行为.我有一个函数删除和重新排序一些列引用,它工作得很好,这意味着data.table我传入的是修改而不分配函数输出.我有另一个添加新列的函数,但这些更改并不总是存在于data.table传入的列中.
这是一个小例子:
library(data.table) # I'm using 1.9.4
test <- data.table(id = letters[1:2], val=1:2)
foobar <- function(dt, col) {
dt[, (col) := 1]
invisible(dt)
}
test
# id val
#1: a 1
#2: b 2
saveRDS(test, "test.rds")
test2 <- readRDS("test.rds")
all.equal(test, test2)
#[1] TRUE
foobar(test, "new")
test
# id val new
#1: a 1 1
#2: b 2 1
foobar(test2, "new")
test2
# id val
#1: a 1
#2: b 2
Run Code Online (Sandbox Code Playgroud)
发生了什么?有什么不同test2 …
我编写了一些代码,使用foreach哪些进程并组合了大量的CSV文件.我在32核机器上运行它,使用%dopar%和注册32个核心doMC.我已经设置.inorder=FALSE,.multicombine=TRUE,verbose=TRUE,和有一个自定义组合函数.
我注意到如果我在一个足够大的文件集上运行它,看起来R会在第一次调用.combine之前尝试处理每个文件.我的证据是,在监测我的服务器HTOP,我最初看到的所有核心刷爆,然后对剩余作业,同时它在〜100批次的联合收割机只使用一个或两个核心(.maxcombine的默认值),如详细的控制台输出中所示.真正有用的是我给foreach的工作越多,看到"First call to combine"所需的时间就越长!
这对我来说似乎是违反直觉的; 我天真地期望foreach处理.maxcombine文件,合并它们,然后继续下一批,将它们与最后一次调用的输出结合起来.combine.我认为,对于.combine它的大多数用途都无关紧要,因为输出的大小与输入大小的总和大致相同; 但是我的组合功能减小了一些尺寸.我的工作足够大,以至于我不可能同时在RAM中保存所有4200多个单独的foreach作业输出,所以我依靠我的节省空间.combine和单独的批处理来看我.
我是对的.在我的所有foreach工作单独完成之前,组合不会被调用吗?如果是这样,为什么会这样,我如何优化(除了使每个作业的输出更小)或改变这种行为?
是否有一种或多种方法可以锁定或保护data.table它,使其无法再就地修改?
假设我们有一个data.table:
dt <- data.table(id = 1, val="foo")
dt
# id val
# 1: 1 foo
Run Code Online (Sandbox Code Playgroud)
然后我可以修改dt以获得以下行为吗?
dt[, val:="bar"]
# error or warning
dt
# id val
# 1: 1 foo ## unmodified
Run Code Online (Sandbox Code Playgroud)
之所以这样,是因为我在工作中创作了一个data.table广泛使用的小R包.它有一些data.tables(翻译表),如果用户意外修改,将导致问题(不正确的翻译).我曾希望使数据"内部"(定义在这里)会解决这个问题,但事实并非如此.
因为这只是data.table对象的问题,我可以使用data.frames,data.table在函数中根据需要复制+转换.如果需要的话,我会走这条路(我的桌子足够小,不会注意到时间/内存开销),但我希望有一个更自然的解决方案.
所以,我有很多data.tables我想组合成一个没有重复行的data.table."天真"的方法是用唯一的方式包装一个rbind调用:unique(do.call(rbind, list.of.tables))
这肯定有效,但它很慢.在我的实际案例中,表格有两列; 哈希字符串和大小.在代码中的这一点上,它们是非键控的.我首先使用hash进行键控,但是组合的增益被键入的时间所抵消.
以下是我对这些选项进行基准测试的方法:
require(data.table)
makeHash <- function(numberOfHashes) {
hashspace <- c(0:9, sapply(97:122, function(x) rawToChar(as.raw(x))))
replicate(numberOfHashes, paste(sample(hashspace, 16), collapse=""))
}
mergeNoKey <- function(tableLength, modCount=tableLength/2) {
A <- B <- data.table(hash=makeHash(tableLength), size=sample(1:(1024^2), tableLength))
A[1:modCount] <- data.table(hash=makeHash(modCount), size=sample(1:(1024^2), modCount))
C <- unique(rbind(A,B))
}
mergeWithKey <- function(tableLength, modCount=tableLength/2) {
A <- B <- data.table(hash=makeHash(tableLength), size=sample(1:(1024^2), tableLength))
A[1:modCount] <- data.table(hash=makeHash(modCount), size=sample(1:(1024^2), modCount))
setkey(A, hash)
setkey(B, hash)
C <- unique(rbind(A,B))
}
require(microbenchmark)
m <- microbenchmark(mergeNoKey(1000), mergeWithKey(1000), times=10)
plot(m)
Run Code Online (Sandbox Code Playgroud)
我玩过tableLength和时代,并且在性能方面没有太大的区别.我觉得有一个更好的data.table-ish方式来做到这一点.
在实践中,我需要使用许多data.tables,而不是两个,所以可伸缩性非常重要; 我只是想保持上面的代码简单.
提前致谢!
我一直在使用dygraphs库在发光的应用程序中放置一些非常好的时间序列图。我特别喜欢结合使用group参数dygraph与dyRangeSelector来同步多个笔形图的缩放级别。
有没有办法使其他闪亮的输出对范围选择器的用户操作起反应?以这个示例应用程序为例,该应用程序显示一个简单的笔形图,并将其汇总在下表中:
# app.R
library(shiny)
library(dygraphs)
library(dplyr)
indoConc <- Indometh[Indometh$Subject == 1, c("time", "conc")]
ui <- fluidPage(
dygraphOutput("plot"),
tableOutput("table")
)
server <- shinyServer(function(input, output) {
output$plot <- renderDygraph({
indoConc %>%
dygraph %>%
dyRangeSelector
})
output$table <- renderTable({
indoConc %>%
filter(time >= min(indoConc$time), time <= max(indoConc$time)) %>%
summarise(total_conc = sum(conc))
})
})
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
我希望该表仅在用户当前选择的时间间隔内求和。这意味着将filter线更改为使用那些最小/最大点以外的值(这将导致不进行过滤)。
如何以适当的格式从范围选择器中提取这两个值,以便可以在该filter调用中使用它们,并在用户移动滑块时使表进行更新?
我制作了一个R包,它托管在我雇主的Atlassian Stash实例上.我一直在告诉其他用户克隆repo然后devtools::install("<path-to-repo>")用来安装软件包.
如何在不克隆存储库的情况下让用户安装软件包?我可以在没有托管代码更容易访问的情况下执行此操作吗?