我目前正在开发一种具有R光泽的蒙特卡罗模拟。 不幸的是,我陷入困境,现在无法看到错误。我之前测试了模拟的代码并且它可以工作。我现在正在尝试的是将它变成一个闪亮的应用程序。
这是我的server.r代码的一部分。它只是完整代码的一部分,但我认为我将错误缩小到这一部分。当我运行应用程序并点击触发dataScenario()
功能的操作按钮时,出现以下错误:
beta%*%t出错(dataScenario()[[1]]):verlangt numerische / komplexe Matrix / Vektor-Argumente
对不起德国人,不完全确定正确的翻译,但基本上R抱怨不能执行矩阵乘法,因为其中一个元素不是矢量/矩阵。
output$plot <- renderPlot({
z <- rep(seq(10, 1000, 10), 4)
x <- c(rep(1, 100), rep(2, 100), rep(3, 100), rep(4, 100))
t.container <- data.frame(time = rep(NA, length(z)),
up = rep(NA, length(z)),
low = rep(NA, length(z)),
geo = z,
strength = x
)
# Censoring
v <- runif(n = nsim, min = 0, max = 1)
X <- as.matrix(dataScenario()[[1]])
Z <- as.matrix(dataScenario()[[2]])
for(i in 1:length(z)){
mu.beta.rebel <- gamma.0 + gamma.geography * z[i] + gamma.geography.q * z[i]^2 + gamma %*% t(Z)
mu <- mean(beta.0) + mu.beta.rebel * x[i] + beta %*% t(X)
t <- (- log(v) / (exp(mu)))^(1 / alpha)
t <- apply(t, 1, mean)
t.container[i, 1] <- mean(t)
t.container[i, 2] <- stats::quantile(t, probs = c(0.025))
t.container[i, 3] <- stats::quantile(t, probs = c(0.975))
}
})
dataScenario()
看起来像这样
dataScenario <- eventReactive(input$simButton, {
# Recode support
rebel.support <- 0
gov.support <- 0
if(length(input$support) == 2){
rebel.support <- 1
gov.support <- 1
}
if(length(input$support) == 1){
rebel.support <- ifelse(input$support == 1, 1, 0)
gov.support <- ifelse(input$support == 2, 1, 0)
}
# Recode
peace <- ifelse(input$peace == TRUE, 1, 0)
# Define covariates on macro level (X)
X <- cbind(rep(input$polity, nsim),
rep((input$gdp - 3556), nsim),
rep(((input$pop * 1e06) - 1.174e+08), nsim),
rep(input$ethnic, nsim),
rep(input$type, nsim), # Conflict Type (no coup d'eta)
rep(rebel.support, nsim), # Rebel Support (no rebel support)
rep(gov.support, nsim), # Government Support (no government support)
rep(peace, nsim), # Termination Type (no peace settlement)
rep(input$n.rebels, nsim) # N rebels (1 rebel group)
)
# Define covariates on micro level (Z)
Z <- cbind(rep(rebel.support, nsim), # Rebel Support (no rebel support)
rep(input$n.diamonds, nsim),
rep(input$oil, nsim)
)
scenario.list <- list(X, Z)
return(scenario.list)
})
为了检查元素的类和尺寸应该相乘,我还添加了这个:
output$test1 <- renderText({
paste("X is of class: ", class(dataScenario()[[1]]), "with ", dim(dataScenario()[[1]])[1], dim(dataScenario()[[1]])[2])
})
output$test2 <- renderText({
paste("beta is of class: ", class(beta), "with ", dim(beta)[1], dim(beta)[2])
})
运行App时输出:
X是类:矩阵100 9 beta属于类:矩阵,1500 9
我知道将X和Y中的两个场景保存为矩阵是多余的,因为两者都已经是矩阵。也直接使用dataScenario()[[1]]
尝试使用它,它会产生与上面相同的错误。
非常欢迎有用的评论。 谢谢!
答案 0 :(得分:0)
发现错误。 Shiny至少返回来自input
的元素作为角色。因此,维度是正确的,但矩阵内的整个数据是char
...通过添加以下行解决它:
X <- matrix(data = unlist(lapply(X, as.numeric)), nrow = nsim, ncol = 9)