我正在构建一个Shiny应用程序,我想在客户端关闭时停止(本地)服务器.实现此目的的一种简单方法是将其包含在shinyServer
函数中:
session$onSessionEnded(function() {
stopApp()
})
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是如果用户决定点击刷新,那么应用程序就会死亡.
我已经尝试了各种变通方法,使用eg reactiveTimer
/ invalidateLater
以特定间隔检查连接.但是,它们采用会话引用(它们特定于会话),因此之后不执行任何操作onSessionEnded
.
有没有办法让一个"全局"服务器计时器定期执行,并且可以检查活动连接?或者另一种实现自动应用程序关闭但允许刷新页面的方法?
在下面的示例中,假设您有一个模型,其中supp
是因子变量.
lm(len ~ dose + supp, data = ToothGrowth)
Run Code Online (Sandbox Code Playgroud)
但我想使用不同的基准水平.我可以直接在公式中指定:
lm(len ~ dose + relevel(supp, "VC"), data = ToothGrowth)
Run Code Online (Sandbox Code Playgroud)
输出将是:
Call:
lm(formula = len ~ dose + relevel(supp, "VC"), data = ToothGrowth)
Coefficients:
(Intercept) dose relevel(supp, "VC")OJ
5.573 9.764 3.700
Run Code Online (Sandbox Code Playgroud)
直接在公式中进行转换非常方便,而不是制作中间数据集或改变现有数据集.例如,当您使用scale
标准化变量时,必须考虑最终模型中包含的其他变量中的缺失.但是,通常,输出中的结果系数名称变得非常难看.
我的问题是:是否可以指定在使用公式时由表达式产生的变量的名称?就像是
lm(len ~ dose + (OJ = relevel(supp, "VC")), data = Toothgrowth)
Run Code Online (Sandbox Code Playgroud)
(这不起作用).
编辑:虽然G.Grothendieck提出的解决方案很好,但它实际上产生了错误的结果.以下示例显示了这一点:
# Create some data:
df <- data.frame(x1 = runif(10), x2=runif(10))
df <- transform(df, y = x1 + x2 + rnorm(10))
# …
Run Code Online (Sandbox Code Playgroud) 考虑以下R代码:
local({
lm <- function(x) x^2
lm(10)
})
Run Code Online (Sandbox Code Playgroud)
这会暂时覆盖该lm
功能,但一旦local
执行,它将"恢复正常".我想知道为什么同样的方法似乎在下一个简单的例子中不起作用:
require(car)
model <- lm(len ~ dose, data=ToothGrowth)
local({
vcov <- function(x) hccm(x) #robust var-cov matrix
confint(model) # confint will call vcov, but not the above one.
})
Run Code Online (Sandbox Code Playgroud)
该confint
函数使用该vcov
函数来获得系数的标准误差,并且想法是通过暂时覆盖使用鲁棒的var-cov矩阵vcov
,而不用"手动"或改变函数.
vcov和confint都是通用函数,我不知道这是不是它按预期工作的原因.这不是我感兴趣的具体例子; 而是概念课.这是命名空间还是范围"问题"?
我正在使用闪亮构建一个Web应用程序,我不确定如何最好地构建应用程序,因为输入依赖于数据,输出(图表)依赖于基于输入的聚合数据.
我试图想出一个简单的应用程序来重现问题.我的设置更高级,与示例无关.假设您有一个产品系列并想分析销售情况.假设每天都创建一个数据集(我不是说数据结构是最优的,但它对于说明我的问题很有用).现在,在应用程序中,从可用日期列表中选择一个日期,然后选择一个产品.日期仅限于可用数据的期间,产品列表仅限于在选定日期实际销售的产品.然后,我们希望绘制白天每小时的总销售额.
我将列出下面这样一个示例的一些代码,其中还创建了一些示例数据.对不起"长"代码.它有点工作,但我有一些担忧.
我的问题是:
1)我想知道事情的执行顺序,特别是首次加载应用程序时,以及每次输入更改时.同样,数据取决于第一输入,第二输入取决于数据.第三,计算用于图表的图表友好数据集.您可能会注意到错误会打印到控制台(并在浏览器中短暂闪烁),但是当值可用时,会进行更新并显示图表.这似乎不是最理想的.
2)当输入依赖于数据/服务器时,当前的最佳实践是什么.R?我看到这个https://groups.google.com/forum/?fromgroups=#!topic/shiny-discuss/JGJx5A3Ge-A但似乎这没有实现,甚至以为后已很旧.
这是两个文件的代码:
# ui.R
######
library(shiny)
shinyUI(pageWithSidebar(
headerPanel("New Application"),
sidebarPanel(
htmlOutput("dateInput"),
htmlOutput("prodInput")
),
mainPanel(
plotOutput("salesplot")
)
))
Run Code Online (Sandbox Code Playgroud)
和:
#server.R
#########
library(shiny)
library(filehash)
set.seed(1)
dates <- format(seq(Sys.Date() - 10, Sys.Date(), "days"), "%Y-%m-%d")
products <- LETTERS
prices <- sample(10:100, size = length(products), replace = TRUE)
names(prices) <- LETTERS
if (file.exists("exampledb")) {
db <- dbInit("exampledb")
} else {
dbCreate("exampledb")
db <- dbInit("exampledb")
for (d in dates) {
no.sales <- sample(50:100, size = 1)
x <- data.frame( …
Run Code Online (Sandbox Code Playgroud) 在R中,您可能已经估计了具有对数转换后的因变量的模型:
mfit <- lm(
formula = log(salary) ~ yrs.service + yrs.since.phd,
data = Salaries
)
Run Code Online (Sandbox Code Playgroud)
然后,您可能想要更改模型框架并调用更新以重新拟合模型:
n <- nrow(Salaries)
mfr <- model.frame(mfit)[sample(1:n, size=n, replace=TRUE),]
mfit2 <- update(mfit, data = mfr)
Run Code Online (Sandbox Code Playgroud)
这将导致错误:
Error in eval(expr, envir, enclos) : object 'salary' not found
Run Code Online (Sandbox Code Playgroud)
原因是公式仍然具有因变量,log(salary)
并且模型框架中的变量称为log(salary)
。R认为它可以找到salary
然后调用log
它。如果不重新采样,将发生相同的错误,该示例仅说明了为什么要这样做。
上面的过程来自引导程序包,在其中执行重采样行。这是预期的行为,还是错误?我知道可以通过转换数据参数中的变量来解决它,但这似乎很烦人并且被忽略了……
我想确定当数据来自SQL服务器时,在F#中创建Deedle Frame的最佳方法是什么.我尝试过如下的事情.
#I "../packages/Deedle.0.9.12"
#load "Deedle.fsx"
#r "System.dll"
#r "System.Data.dll"
#r "System.Data.Linq"
#r "FSharp.Data.TypeProviders.dll"
open System
open System.Data
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Deedle
type dbSchema = SqlDataConnection<"Data Source=server;Initial Catalog=database;Integrated Security=SSPI;">
let db = dbSchema.GetDataContext()
let fr = db.SomeTable |> Frame.ofRows
Run Code Online (Sandbox Code Playgroud)
以及其他一些变种.但没有运气.我是F#和Deedle的新手.我可以看出上面的原因不起作用(Frame.ofRows与参数不兼容)但我不知道最好的方法是什么(甚至如何继续).
如果我想要自定义值假人,我该如何使用公式界面,例如,如果我想要值1和2,而不是0和1.估计可能如下所示,其中supp
是因子变量.
fit <- lm(len ~ dose + supp, data = ToothGrowth)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,没有太多使用不同的值,但在许多情况下"重写"模型它可能是有用的.
编辑:实际上,我有3个级别,并希望两列的编码方式不同,因此一个是1/0变量,另一个是1/2变量.上面的例子只有两个级别.