为什么在 Shiny 中会出现“下标越界”错误,但在 R 中却没有?

2024-03-09

我最近在shiny google group发布了类似的询问,但没有找到解决方案。我们正在开发一个闪亮的应用程序,正如主题所示,我们在运行该应用程序时收到“错误:下标越界”消息。然而,当我们隔离有问题的代码并在 RStudio 中单独运行它时,没有错误。

这让我想知道 Shiny 本身是否存在错误,或者我们是否遗漏了某些东西。

请参阅下面的说明以及产生错误的小示例。我们使用的是 Shiny 版本 0.8.0 和 RStudio 0.98.501。

感谢您的帮助!


要运行该应用程序,请将 ui.R 和 server.R (见下文)放入文件夹中并运行

library(shiny)
runApp("<folder path>")

它应该生成一个用户界面,左侧有一个按钮,但在右侧您将看到“错误:下标超出范围”。

但是,如果只运行以下三行代码(大约在 server.R 中的第 57-59 行)

show=data.frame(ps=c(4,-1,0,1),ns=c(0,1,0,0),ts=c(45842,15653,28535,21656))
best.fit1=regsubsets(ts~ps+ns,data=show,nvmax=1)
pred1=predict.regsubsets(best.fit1,show,id=1)  # line that offends Shiny

在 RStudio 中(需要包含函数“predict.regsubsets” - 在 server.R 的开头给出),那么就没有错误。

#####################
## server.R
#####################

library(rms)
library(leaps)
library(shiny)
library(datasets)
library(stringr)
library(ttutils)
library(plyr)
library(utils)
library(ggplot2)

# object is a regsubsets object
# newdata is of the form of a row or collection of rows in the dataset
# id specifies the number of terms in the model, since regsubsets objects 
#  includes models of size 1 up to a specified number
predict.regsubsets=function(object,newdata,id,...){
  form=as.formula(object$call[[2]])

  mat=model.matrix(form,newdata)

  mat.dims=dim(mat)
  coefi=coef(object,id=id)
  xvars=names(coefi)
  # because mat only has those categorical variable categories associated with newdata, 
  # it is possible that xvars (whose variables are defined by the "best" model of size i)
  # has a category that is not in mat
  diffs=setdiff(xvars,colnames(mat))
  ndiffs=length(diffs)
  if(ndiffs>0){
    # add columns of 0's for each variable in xvars that is not in mat
    mat=cbind(mat,matrix(0,mat.dims[1],ndiffs))
    # for the last "ndiffs" columns, make appropriate names
    colnames(mat)[(mat.dims[2]+1):(mat.dims[2]+ndiffs)]=diffs
    mat[,xvars]%*%coefi
  }
  else{
    mat[,xvars]%*%coefi
  }
}

# Define server logic required to summarize and view the selected dataset
shinyServer(function(input, output) {

mainTable1 <- reactive({

  }) 

output$table21 <- renderTable({
    mainTable1()
  })


formulamodel1 <- reactive({
    #ticketsale<-dataset1Input()

  show=data.frame(ps=c(4,-1,0,1),ns=c(0,1,0,0),ts=c(45842,15653,28535,21656))
  best.fit1=regsubsets(ts~ps+ns,data=show,nvmax=1)
  pred1=predict.regsubsets(best.fit1,show,id=1)

  })

output$model1fit <- renderPrint({
    formulamodel1()

  }) 

 })

######################
## end server.R
######################

######################
## ui.R
######################

library(rms)
library(leaps)
library(shiny)
library(datasets)
library(stringr)
library(ttutils)
library(plyr)
library(utils)
library(ggplot2)

shinyUI(pageWithSidebar(

headerPanel("Forecasting ticket sales for xxx"),

sidebarPanel(
        p(strong("Model Fitting")),

    selectInput("order1", "Sort results by:",c("a","b","c")),
    submitButton("Run Model")

    ),

   mainPanel(

    h3(strong("Model fit without using ticket sales") ),
    tableOutput("table21"),
    verbatimTextOutput(outputId = "model1fit")

   )
))

这三行似乎仅在全局环境中执行时才有效。如果您获取该片段并在local({...})阻止你会看到同样的错误。

错误来自第一行predict.regsubsets,你看的地方object$call[[2]]. It's object$call这取决于它是否在全局环境中执行,这是非常不同的;它是在leaps:::regsubsets.formula通过致电sys.call(sys.parent())。也许这需要sys.call(sys.parent(0))(只是猜测)?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Shiny 中会出现“下标越界”错误,但在 R 中却没有? 的相关文章

  • 在 Shiny 中设置一个绘图缩放以匹配另一个绘图缩放

    我正在尝试使用情节重排获取一个图的 x 轴缩放限制 并将它们应用到 Shiny 中的另一个图 到目前为止 我可以从 plot1 x轴限制 获取相关的plotly relayout数据 将其转换 从数字到日期 并在绘制 plot2 之前将其提
  • 如果“testthat”测试在“R”中失败,则打印自定义诊断信息

    I use a testthat单元测试来检查是否data frame函数返回的结果与我期望它返回的结果相同 如果测试失败 testthat打印一些诊断信息 例如 MyFunction df orig is not identical to
  • 使用 ggplot2 修改点子集的形状

    我正在尝试绘制一个沿大量维度变化的大型散点图 这是我的起始情节 p lt ggplot mtcars aes wt mpg shape cyl colour gear size carb geom point 使用mtcars数据集 我只是
  • R 中的 NA 替换函数

    我正在尝试替换矩阵中的 NA mat 零 我在用着mat is na mat lt 0 当我有 18946 个变量的 94531 个观察值或更小的矩阵时 效果很好 但我在 22752 个变量的 112039 个观察值的矩阵上尝试它 R 显示
  • 用于清除工作空间和转储存储的 R 全局函数

    我希望创建一个全局函数来清除我的工作区并转储我的内存 我将我的函数称为 cleaner 并希望它执行以下代码 remove list ls gc 我尝试在全局环境中创建该函数 但是当我运行它时 控制台仅打印该函数的文本 在我要获取的函数文件
  • 在函数内部调用 clusterApply 时,性能会下降

    我遇到了一个奇怪的问题clusterApply 我已经能够尽可能地隔离它 如下所示 首先 我从全局环境运行以下代码 require parallel cl lt makeCluster rep localhost 20 SOCK xl lt
  • 如何更新条件公式?

    让我直接进入示例 考虑以下等式 frml lt formula y a b x z 使用这样的公式规范 例如和AER ivreg 我想更新这个公式 使其显示为 frml2 lt y a b c x z w 但是 我不确定如何更新条件标志之前
  • 查找数据帧列表中同一列中的所有重复值并将其转换为 NULL

    我有一个清单BELGIAN COAST list包含数百个数据帧 df1 df2 15 列 X 1000 行 每个数据帧的最后一列称为Chemicals并包含一些字符 例如Sulfate or Ammonia 但是这一列有很多行Chemic
  • R:将 readRDS 应用于 .Rds 文件名的列表对象

    我有几个包含数据帧对象的 Rds 文件 我想对每个文件应用一个函数并将数据帧绑定到单个数据帧中 但是 当我尝试从文件名列表中读取多个 Rds 文件时 我收到错误 FUN X i 中的错误 从连接读取时出错 readRDS 不适用于列表吗 R
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 在 R 中绘制对数正态概率密度

    我正在尝试在 R 中生成对数正态概率密度图 其中包含 3 个不同的均值对数和标准差对数 我尝试了以下方法 但我的图表太丑了 看起来一点也不好看 x lt seq 0 10 length 100 a lt dlnorm x meanlog 0
  • 逻辑回归/二项式的 glmnet 误差

    当尝试将 glmnet 与 family binomial 配合以进行逻辑回归拟合时 出现此错误 gt data lt read csv DAFMM HE16 matrix csv header F gt x lt as data fram
  • 仅保留百分比的尾随零

    给出以下示例 library pander tableAbs lt Titanic 1 1 tablePct lt round prop table tableAbs 100 2 table lt cbind tableAbs tableP
  • 解析,用三点参数替换

    让我们考虑一个典型的deparse substitute R call f1 lt function u x y print deparse substitute x varU vu varX vx varY vy f1 u varU x
  • R 中的字符串作为函数参数

    数据框chocolates列出了糖果的类型以及每种糖果的一组评级 ID sweetness filling crash snickers 0 67 0 55 0 40 milky way 0 81 0 53 0 56 我正在编写一个函数 它
  • 使用outer代替expand.grid

    我正在寻找尽可能快的速度并留在基地做该做的事expand grid做 我用过outer为过去类似的目的创建一个向量 像这样的东西 v lt outer letters LETTERS paste0 unlist v lower tri v
  • 如何计算嵌套函数中的粘合表达式?

    我正在尝试嵌套一个函数 该函数将两个字符串粘合在一起 该函数使用组合字符串来命名数据帧的列 然而 问题似乎是粘合表达式没有足够早地评估为字符串 我可以 并且应该 强制在将表达式作为参数传递给另一个函数之前对其进行求值吗 library ti
  • R:将 JSON 时间格式转换为 POSIX

    我有一个 JSON 字符串 并将其放入数据框中 我能够做到这一点 但我在使用 apply 函数之一将所有时间字符串转换为 POSIX 格式时遇到问题 See here https stackoverflow com questions 90
  • 具有 dplyr、tidyverse 和 broom 的相关矩阵 - P 值矩阵

    全部 我想使用以下方法从相关矩阵中获取 p 值dplyr 和 或扫帚包 并同时测试多个变量 我知道其他方法 但 dplyr 对我来说似乎更简单 更直观 此外 dplyr 需要关联每个变量以获得特定的 p 值 这使得该过程更容易 更快 我检查
  • 替换字符串/文本中“从第 n 次到最后一次”出现的单词

    这个问题以前曾被问过 但尚未得到令提问者满意的答案 https stackoverflow com questions 36368712 how to use stringrs replace all function to replace

随机推荐