gpt4 book ai didi

r - 在 R 中,为什么一个函数有效而另一个函数无效,因为它们都是非常相似的数字向量?

转载 作者:行者123 更新时间:2023-12-04 14:02:09 24 4
gpt4 key购买 nike

在运行下面介绍的 MWE 代码时,它可以很好地运行插值场景。但是,如果我注释掉当前未注释的第一个自定义 interpol() 函数,并取消注释第二个 interpol() 函数,则结果不会绘制。为什么??它们的输出形式非常相似!

我在 R studio 控制台中运行了两个 interpol() 版本来进行测试。他们都按应有的方式工作。当我运行 is.vector() 时它们都是向量,当我运行 is.numeric() 时它们都是数字。

显然,第二个 interpol() 不进行插值,它计算一个 sumproduct(测试 sumproduct 以了解此代码的演变)。在默认情况下,它会生成一个包含 10 个元素的向量,每个元素 = 5。为什么这不会像第一个 interpol() 那样绘制出来?

MWE代码:

library(shiny)
library(shinyMatrix)
library(dplyr)
library(ggplot2)

interpol <- function(a, b) { # a = periods, b = matrix inputs
c <- rep(NA, a)
c[1] <- b[1]
c[a] <- b[2]
c <- approx(seq_along(c)[!is.na(c)], c[!is.na(c)], seq_along(c))$y
return(c)
}

# interpol <- function(a, b) { # a = periods, b = matrix inputs
# c <- rep(NA, a)
# c[] <- sum(b[,1]) %*% sum(b[,2])
# return(c)
# }

ui <- fluidPage(
sliderInput('periods', 'X-axis periods:', min=1, max=10, value=10),
matrixInput(
"myMatrixInput",
label = "Values to sumproduct paired under each scenario heading:",
value = matrix(c(1, 5), 1, 2, dimnames = list(NULL, rep("Scenario 1", 2))),
cols = list(extend = TRUE, delta = 2, names = TRUE, delete = TRUE, multiheader = TRUE),
rows = list(extend = FALSE, delta = 1, names = FALSE, delete = FALSE),
class = "numeric"),
plotOutput("plot")
)

server <- function(input, output, session) {

observeEvent(input$myMatrixInput, {
tmpMatrix <- input$myMatrixInput

# Remove any empty matrix columns
empty_columns <- sapply(tmpMatrix, function(x) all(is.na(x) | x == ""))
tmpMatrix <- tmpMatrix[, !empty_columns, drop=FALSE]

# Assign column header names
colnames(tmpMatrix) <- paste("Scenario", rep(1:ncol(tmpMatrix), each = 2, length.out = ncol(tmpMatrix)))

isolate( # isolate update to prevent infinite loop
updateMatrixInput(session, inputId = "myMatrixInput", value = tmpMatrix)
)
})

plotData <- reactive({
tryCatch(
lapply(seq_len(ncol(input$myMatrixInput)/2),
function(i){
tibble(
Scenario = colnames(input$myMatrixInput)[i*2-1],
X = seq_len(input$periods),
Y = interpol(input$periods, input$myMatrixInput[1,(i*2-1):(i*2)])
)
}) %>% bind_rows(),
error = function(e) NULL
)
})

output$plot <- renderPlot({
req(plotData())
plotData() %>% ggplot() + geom_line(aes(
x = X,
y = Y,
colour = as.factor(Scenario)
))
})

}

shinyApp(ui, server)

最佳答案

为了便于解释,我将第一个函数称为 interpol1,将第二个函数称为 interpol2

lapply 中调用函数 (interpol(input$periods, input$myMatrixInput[1,(i*2-1):(i*2)])) input$myMatrixInput[1,(i*2-1):(i*2)] 返回一个数值向量而不是矩阵。在 interpol1 中,您使用 b[1]b[2]b 的值进行子集化,这是正确的对矢量进行子集化的方法,但在 interpol2 中,您使用 b[,1]b[,2] 对不正确的矢量进行子集化返回错误 error in b[, 1] : incorrect number of dimensions。我认为您期望 b 是一个矩阵,因此您使用了 b[, 1]

一个解决方法是将输入保留为矩阵,这可以通过使用 -

Y = interpol1(input$periods, input$myMatrixInput[1,(i*2-1):(i*2), drop = FALSE])

这应该适用于函数 interpol1interpol2

关于r - 在 R 中,为什么一个函数有效而另一个函数无效,因为它们都是非常相似的数字向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69641141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com