小编Cla*_*nJY的帖子

使conditionalPanel依赖于使用fileInput上传的文件

所以我正在尝试创建一个闪亮的应用程序,我有一个按钮,只显示文件已上传; 为此我使用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,因此长度/大小非零,是吗?

在完成上传至少一个文件之前,我可以使用什么条件隐藏按钮?

我认为,另一种选择是,以取代conditionalPaneluiOutput,并呼吁renderUI({actionButton(...)})在server.R的观察/分离块,是看input.files(内if (nrow(input$files) < 1) return()); 这是唯一的方法吗?如果我能以这种方式做到这一点,是什么让我选择其中一个(除了conditionalPanel导致更少的代码)?

r shiny

29
推荐指数
1
解决办法
6321
查看次数

在函数中通过引用向data.table添加新列并不总是有效

在写一个依赖的包时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 …

r data.table

16
推荐指数
1
解决办法
1349
查看次数

foreach什么时候打电话.cone?

我编写了一些代码,使用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工作单独完成之前,组合不会被调用吗?如果是这样,为什么会这样,我如何优化(除了使每个作业的输出更小)或改变这种行为?

parallel-processing foreach r

6
推荐指数
1
解决办法
792
查看次数

锁定或保护R中的data.table

是否有一种或多种方法可以锁定或保护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在函数中根据需要复制+转换.如果需要的话,我会走这条路(我的桌子足够小,不会注意到时间/内存开销),但我希望有一个更自然的解决方案.

r data.table

6
推荐指数
1
解决办法
435
查看次数

使用data.tables时替换唯一(rbind())

所以,我有很多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,而不是两个,所以可伸缩性非常重要; 我只是想保持上面的代码简单.

提前致谢!

r data.table

5
推荐指数
1
解决办法
1474
查看次数

在闪亮的应用程序中从dygraph提取dyRangeSelector值

我一直在使用dygraphs库在发光的应用程序中放置一些非常好的时间序列图。我特别喜欢结合使用group参数dygraphdyRangeSelector来同步多个笔形图的缩放级别。

有没有办法使其他闪亮的输出对范围选择器的用户操作起反应?以这个示例应用程序为例,该应用程序显示一个简单的笔形图,并将其汇总在下表中:

# 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 dygraphs shiny

5
推荐指数
1
解决办法
1065
查看次数

从Atlassian Stash安装R包

我制作了一个R包,它托管在我雇主的Atlassian Stash实例上.我一直在告诉其他用户克隆repo然后devtools::install("<path-to-repo>")用来安装软件包.

如何在克隆存储库的情况下让用户安装软件包?我可以在没有托管代码更容易访问的情况下执行此操作吗?

git r devtools bitbucket-server

4
推荐指数
1
解决办法
564
查看次数