R、Shiny、およびコーディング全般に不慣れで、質問があります。同様の質問を読んでいますが、回答に基づいて Shiny アプリを機能させることができません。基本的に、ユーザーが数値入力を入力し、それらの入力をデータ フレームに入れ、プロットを出力できるようにしたいと考えています。UI のコードの関連部分は次のとおりです。
ui <- fluidPage(
titlePanel("IQ Plots"),
sidebarLayout(
sidebarPanel(
numericInput(inputId = "FSIQ",
label = "FSIQ",
min = 40, max = 160, value = 100),
numericInput(inputId = "VCI",
label = "VCI",
min = 40, max = 160, value = 100),
numericInput(inputId = "VSI",
label = "VSI",
min = 40, max = 160, value = 100),
numericInput(inputId = "FRI",
label = "FRI",
min = 40, max = 160, value = 100),
numericInput(inputId = "WMI",
label = "WMI",
min = 40, max = 160, value = 100),
numericInput(inputId = "PSI",
label = "PSI",
min = 40, max = 160, value = 100)
そして、ここにサーバーがあります:
server <- function(input, output) {
### Set dataframe
Index <- c("VCI", "VSI", "FRI", "WMI", "PSI")
Index_Score <- c(VCI, VSI, FRI, WMI, PSI)
Index_Verbal <- c("Verbal", "Non-verbal", "Non-verbal", "Verbal", "Non-verbal")
Index_Auto <- c("Mediated", "Mediated", "Mediated", "Automatic", "Automatic")
Index.data <- data.frame(Index, Index_Score, Index_Verbal, Index_Auto)
newIndex_Score <- reactive({c(input$VCI, input$VSI, input$FRI, input$WMI, input$PSI)})
newIndex.data <- reactive({data.frame(Index, newIndex_Score, Index_Verbal, Index_Auto)})
output$IQplot <- renderPlot({
library(ggplot2)
ggplot(data = IQdist, aes(x = ndist, y = IQy)) +
fdist +
ggtitle("Full Scale IQ") +
xlab("IQ score") +
ylab("Frequency") +
scale_x_continuous(limits = c(40,160), breaks = seq(55,145,15)) +
geom_segment(aes(x=input$FSIQ, y = 0, xend=input$FSIQ,
yend = dnorm(input$FSIQ, IQmean, IQsd)),
color = "blue", size = 2) +
theme(axis.text.y = element_blank(),
axis.ticks = element_blank()) +
geom_ribbon(data=subset(IQdist, ndist > 85 & ndist < 115),
aes(ymax=IQy),ymin=0,fill="green", alpha = 0.3) +
geom_ribbon(data=subset(IQdist, ndist > 70 & ndist < 85),
aes(ymax=IQy),ymin=0,fill="yellow", alpha = 0.3) +
geom_ribbon(data=subset(IQdist, ndist > 115 & ndist < 130),
aes(ymax=IQy),ymin=0,fill="yellow", alpha = 0.3) +
geom_ribbon(data=subset(IQdist, ndist <= 70.5),
aes(ymax=IQy),ymin=0,fill="red", alpha = 0.3) +
geom_ribbon(data=subset(IQdist, ndist > 130),
aes(ymax=IQy),ymin=0,fill="red", alpha = 0.3) +
scale_y_continuous(limits = c(0,.03), expand = c(0,0)) +
expand_limits(y=0) +
geom_segment(aes(x = 100, y = 0, xend = 100,
yend = IQy), color = "red", size = 1) +
annotate('text', x = 100, y = 0.01,
label = "<------------Average------------>", col = "black")
})
output$Indplot <- renderPlot({
library(ggplot2)
newIndex.data()$Index <- factor(newIndex.data()$Index, levels = c("VCI", "VSI", "FRI", "WMI", "PSI"))
newIndex.data()$Index <- factor(newIndex.data()$Index,
levels = newIndex.data()$Index[order(newIndex.data()$Index)])
Indplot <- ggplot(data = newIndex.data(), x = Index, y = newIndex_Score()) +
ggtitle("Index Scores") +
xlab("WISC-V Index") +
ylab("Standard Score") +
scale_y_continuous(limits = c(0,160), breaks = seq(10,160,15),
expand = c(0,0)) +
geom_rect(data = newIndex.data(), aes(x = Index, y = newIndex_Score()),
xmin = as.numeric(newIndex.data()$Index[[1]]) - 1,
xmax = as.numeric(newIndex.data()$Index[[5]]) + 1,
ymin = 85,
ymax = 115,
fill = "green",
alpha = 0.1) +
geom_rect(data = newIndex.data, aes(x = Index, y = newIndex_Score()),
xmin = as.numeric(newIndex.data()$Index[[1]]) - 1,
xmax = as.numeric(newIndex.data()$Index[[5]]) + 1,
ymin = 70,
ymax = 85,
fill = "yellow",
alpha = 0.1) +
geom_rect(data = newIndex.data(), aes(x = Index, y = newIndex_Score()),
xmin = as.numeric(newIndex.data()$Index[[1]]) - 1,
xmax = as.numeric(newIndex.data()$Index[[5]]) + 1,
ymin = 115,
ymax = 130,
fill = "yellow",
alpha = 0.1) +
geom_col(aes(x = Index, y = newIndex_Score()), fill = "blue4") +
geom_hline(yintercept = 100, color = "red", size = 2)
Indplot
})
}
最初のプロット「IQplot」が機能するのは、データ フレームに入力する必要がある 5 つの入力ではなく、プロットが反応する必要がある入力が 1 つだけであるためだと思います。2 番目のプロット "Indplot" が Error: cannot coerce で表示され続けます... コードに見られるように、()
データ フレームの後に のように配置してみました。この質問が非常に基本的なものである場合は、お詫び申し上げます。newIndexdata()$Index
newIndexdata$Index