for reactive函数中的循环:子分配类型修复中的不兼容类型(从闭包到逻辑)

for reactive函数中的循环:子分配类型修复中的不兼容类型(从闭包到逻辑),r,dataframe,for-loop,shiny,reactive-programming,R,Dataframe,For Loop,Shiny,Reactive Programming,我从闪亮的应用程序开始,希望在闪亮的应用程序中创建一个信用计算器。但是,实现for循环来创建输出数据似乎有问题 用户界面 服务器 library(shiny) library(dplyr) shinyServer( function(input, output){ mthl.inter = reactive((input$yr.inter/1200)) # NUMERIC INPUT credit.amount = reactive(input$credit.amount)

我从闪亮的应用程序开始,希望在闪亮的应用程序中创建一个信用计算器。但是,实现for循环来创建输出数据似乎有问题

用户界面

服务器

library(shiny)
library(dplyr)
shinyServer(
  function(input, output){

    mthl.inter = reactive((input$yr.inter/1200)) # NUMERIC INPUT
    credit.amount = reactive(input$credit.amount) # SLIDER INPUT
    mthl.rate = reactive(input$mthl.rate) # NUMERIC INPUT

    # calculate repayment time

    credit.decay = reactive(
      as.numeric((log(1 - (mthl.inter() * credit.amount() / mthl.rate())) / 
        log(1 + mthl.inter())) * -1)
      ) 

    # calculate credit model 

    credit.model <- reactive({
      credit.df <- data.frame(rep(NA, credit.decay() %>% ceiling()))
      credit.df[1,1] <- credit.amount

      for (n in 2:(credit.decay() %>% ceiling()) ){
        credit.df[n,1] = credit.df[n-1,1] * (1 + mthl.inter()) - mthl.rate()
      }

      return(credit.df)

    })


    output$decaytime = renderText(credit.decay() %>% ceiling())
    output$creditmod = renderTable(credit.model())
  }
)
库(闪亮)
图书馆(dplyr)
shinyServer(
功能(输入、输出){
mthl.inter=无功((输入$yr.inter/1200))#数字输入
credit.amount=被动(输入$credit.amount)#滑块输入
mthl.rate=无功(输入$mthl.rate)#数字输入
#计算还款时间
信用衰减=反应性(
as.numeric((日志(1-(mthl.inter()*credit.amount()/mthl.rate())/
日志(1+mthl.inter())*-1)
) 
#计算信用模型
credit.model%上限()
输出$creditmod=可渲染(credit.model())
}
)
这将返回以下错误:

Warning: Error in <-: incompatible types (from closure to logical) in subassignment type fix

警告:欢迎使用stackoverflow中出现错误

您需要
req()
来确保没有空的用户输入传递给您的函数。 此外,我取消了您输入的公告以稍微延迟计算(因此用户有一些时间在计算开始之前完成输入)

然而,您的计算似乎只适用于credit.amount和mthl.rate的某些比率。您可能需要在此处添加一些进一步的检查

请检查以下内容:

library(shiny)
library(dplyr)

ui <- fluidPage(
  titlePanel("Farm Statistic"), # TITLE CONTENT
  sidebarLayout(
    sidebarPanel(("Enter your Farm Information here"),
                 numericInput("credit_amount",
                              "How much is your credit?",
                              NA),
                 sliderInput("yr_inter", 
                              "Interrest rate p.a.",
                              min = 0.5, 
                              max = 20, 
                              value = 8.5, 
                              step = 0.5
                 ),
                 numericInput("mthl_rate",
                               "Your monthly payment",
                               NA)
    ), # SIDE BAR CONTENT
    mainPanel(("Credit decay"),
              textOutput("decaytime"),
              tableOutput("creditmod")
              # , textOutput("")
    ) # MAIN PANEL CONTENT
  )
)

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

  mthl.inter.tmp <- reactive({req(input$yr_inter/1200)}) # NUMERIC INPUT
  credit.amount.tmp <- reactive({req(input$credit_amount)}) # SLIDER INPUT
  mthl.rate.tmp <- reactive({req(input$mthl_rate)}) # NUMERIC INPUT

  mthl.inter <- debounce(mthl.inter.tmp, 500)
  credit.amount <- debounce(credit.amount.tmp, 500)
  mthl.rate <- debounce(mthl.rate.tmp, 500)

  # calculate repayment time
  credit.decay = reactive({
    req(mthl.inter(), credit.amount(), mthl.rate())
    as.numeric((log(1 - (mthl.inter() * credit.amount() / mthl.rate())) / log(1 + mthl.inter())) * -1)
    }) 

  # calculate credit model 
  credit.model <- reactive({
    req(credit.decay())
    credit.df <- data.frame(rep(NA, credit.decay() %>% ceiling()))
    credit.df[1,1] <- credit.amount()

    for (n in 2:(credit.decay() %>% ceiling()) ){
      credit.df[n,1] = credit.df[n-1,1] * (1 + mthl.inter()) - mthl.rate()
    }

    return(credit.df)

  })

  output$decaytime = renderText(credit.decay() %>% ceiling())
  output$creditmod = renderTable(credit.model())
}

shinyApp(ui, server)
库(闪亮)
图书馆(dplyr)

欢迎来到stackoverflow

您需要
req()
来确保没有空的用户输入传递给您的函数。 此外,我取消了您输入的公告以稍微延迟计算(因此用户有一些时间在计算开始之前完成输入)

然而,您的计算似乎只适用于credit.amount和mthl.rate的某些比率。您可能需要在此处添加一些进一步的检查

请检查以下内容:

library(shiny)
library(dplyr)

ui <- fluidPage(
  titlePanel("Farm Statistic"), # TITLE CONTENT
  sidebarLayout(
    sidebarPanel(("Enter your Farm Information here"),
                 numericInput("credit_amount",
                              "How much is your credit?",
                              NA),
                 sliderInput("yr_inter", 
                              "Interrest rate p.a.",
                              min = 0.5, 
                              max = 20, 
                              value = 8.5, 
                              step = 0.5
                 ),
                 numericInput("mthl_rate",
                               "Your monthly payment",
                               NA)
    ), # SIDE BAR CONTENT
    mainPanel(("Credit decay"),
              textOutput("decaytime"),
              tableOutput("creditmod")
              # , textOutput("")
    ) # MAIN PANEL CONTENT
  )
)

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

  mthl.inter.tmp <- reactive({req(input$yr_inter/1200)}) # NUMERIC INPUT
  credit.amount.tmp <- reactive({req(input$credit_amount)}) # SLIDER INPUT
  mthl.rate.tmp <- reactive({req(input$mthl_rate)}) # NUMERIC INPUT

  mthl.inter <- debounce(mthl.inter.tmp, 500)
  credit.amount <- debounce(credit.amount.tmp, 500)
  mthl.rate <- debounce(mthl.rate.tmp, 500)

  # calculate repayment time
  credit.decay = reactive({
    req(mthl.inter(), credit.amount(), mthl.rate())
    as.numeric((log(1 - (mthl.inter() * credit.amount() / mthl.rate())) / log(1 + mthl.inter())) * -1)
    }) 

  # calculate credit model 
  credit.model <- reactive({
    req(credit.decay())
    credit.df <- data.frame(rep(NA, credit.decay() %>% ceiling()))
    credit.df[1,1] <- credit.amount()

    for (n in 2:(credit.decay() %>% ceiling()) ){
      credit.df[n,1] = credit.df[n-1,1] * (1 + mthl.inter()) - mthl.rate()
    }

    return(credit.df)

  })

  output$decaytime = renderText(credit.decay() %>% ceiling())
  output$creditmod = renderTable(credit.model())
}

shinyApp(ui, server)
库(闪亮)
图书馆(dplyr)

非常感谢您的帮助和努力添加一些细节。作为学习者,学习好的例子总是有帮助的不客气!我只是想解释一下为什么我重命名了您的输入:您应该尽量避免在输入名称中使用句点,因为它们在JavaScript中是特殊字符。请参阅
注释
-干杯非常感谢您的帮助和为添加一些详细信息所做的努力。作为学习者,学习好的例子总是有帮助的不客气!我只是想解释一下为什么我重命名了您的输入:您应该尽量避免在输入名称中使用句点,因为它们在JavaScript中是特殊字符。请参见
注释
-干杯