Shiny 需要一些帮助来写一个“";向心力;物理课应用程序
我对rshiny还不太熟悉。我确信我的问题在各种文档中都得到了解决,但我没有找到它 向心力(物理)取决于质量、速度和半径。我想让学生们玩这三个,看看原力会发生什么。我正在使用滑块作为变量 但我也希望他们能探索,当力固定时,速度和半径之间的关系。为此,我使用了一个复选框,并尝试捕捉是移动了半径滑块(在这种情况下,更新速度滑块以使力固定)还是移动了速度滑块(在这种情况下,更新保持力固定的半径滑块) 这导致了一些不希望出现的行为-移动一个滑块会更新另一个滑块,但它们会不断更新,最终会一直向左或向右移动 我认为,当移动所有三个滑块时,我希望力输出是被动的,但选中复选框时,我不希望力输出是被动的。我想把它修好 我需要一些帮助或提示。这是我的密码:Shiny 需要一些帮助来写一个“";向心力;物理课应用程序,shiny,shiny-reactivity,Shiny,Shiny Reactivity,我对rshiny还不太熟悉。我确信我的问题在各种文档中都得到了解决,但我没有找到它 向心力(物理)取决于质量、速度和半径。我想让学生们玩这三个,看看原力会发生什么。我正在使用滑块作为变量 但我也希望他们能探索,当力固定时,速度和半径之间的关系。为此,我使用了一个复选框,并尝试捕捉是移动了半径滑块(在这种情况下,更新速度滑块以使力固定)还是移动了速度滑块(在这种情况下,更新保持力固定的半径滑块) 这导致了一些不希望出现的行为-移动一个滑块会更新另一个滑块,但它们会不断更新,最终会一直向左或向右移动
library(shiny)
# Define UI for application that explores centripetal acceleration
update_svg <- function(radius, velocity) {
svg <- paste(readLines("images/centripetal-animated.svg"), collapse = "\n")
# transformations ...
scale <- round(radius/40, 4)
dt <- round(2*pi*radius/velocity, 2)
dy <- round(-36*velocity/62.83/scale, 4)
a <- velocity^2/radius
dx <- round(-52.92*a/100/scale, 4)
x0 <- 148.166664 + dx
cx <- round((scale - 1)*95.25, 2)
cy <- round((scale - 1)*100.54166, 2)
svg <- sub("\\{scale\\}", scale, svg)
svg <- sub("\\{DY\\}", dy, svg)
svg <- sub("\\{X0\\}", x0, svg)
svg <- sub("\\{DX\\}", -dx, svg)
svg <- sub("\\{DT\\}", dt, svg)
svg <- sub("\\{CX\\}", -cx, svg)
svg <- sub("\\{CY\\}", -cy, svg)
con <- paste0(tempfile("svg"), ".svg")
writeLines(svg, con)
con
}
ui <- fluidPage(
# Application title
titlePanel("Physics"),
# Tabset panel
tabsetPanel(
tabPanel("Centripetal Acceleration",
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
sliderInput("mass",
"Mass (kg):",
min = 0,
max = 10,
value = 5),
sliderInput("radius",
"Radius (m):",
min = 0,
max = 60,
value = 30),
sliderInput("velocity",
"Tangential Velocity (m/s):",
min = 0,
max = 60,
value = 30),
textOutput("angular"),
textOutput("acceleration"),
list(textInput("force", "Force (N):", 150), checkboxInput("freeze", "Fix mass & force"))
),
# Show a plot of the generated distribution
mainPanel(
imageOutput("svg")
)
)
)
)
)
# Define server logic
server <- function(input, output, session) {
# if force is fixed, observe change in radius and adjust
# velocity to maintain fixed acceleration and force.
observeEvent(input$radius, {
if (input$freeze == 1) {
updateSliderInput(session = session, inputId = "velocity",
value = sqrt(as.numeric(input$force)*input$radius/input$mass))
}
})
# if force is fixed, observe change in velocity and
# adjust radius to maintain fixed acceleration and force.
observeEvent(input$velocity, {
if (input$freeze == 1) {
updateSliderInput(session = session, inputId = "radius",
value = input$mass*input$velocity^2/as.numeric(input$force))
}
})
observe({
angular <- input$velocity/input$radius
acceleration <- input$radius*angular^2
force <- input$mass*acceleration
output$angular <- renderText(paste0("Angular Velocity: ", signif(angular, 2), " (rad/s)"))
output$acceleration <- renderText(paste0("Acceleration: ", signif(acceleration, 2), " (m/s^2)"))
updateTextInput(session ,"force", value = signif(force, 2))
output$svg <- renderImage(list(src = update_svg(input$radius, input$velocity)))
})
}
# Run the application
shinyApp(ui = ui, server = server)
库(闪亮)
#为探索向心加速度的应用程序定义UI
更新svg