Я создал функцию для создания графиков в R, и есть аргумент m_col, который используется, когда мой график имеет более одного столбца.
Я попробовал этот код:
generateGraph <- function(data, m_col = FALSE) {
if (m_col == TRUE) {
col <- names(data)[2]
} else {
col <- names(data)[1]
}
data |>
select(everything(), var = {{col}}) |>
ggplot(aes(x = ifelse(m_col == TRUE, reorder(var, -n), var),
y = n,
ymin = n_low,
ymax = n_upp)) +
geom_bar(stat = "identity",
fill = "#273499",
alpha = .8,
width = .7)
}
generateGraph(question, m_col = TRUE)
Результат таков:
Но должно быть так:
Что я делаю не так?
Мой dput:
structure(list(resposta = structure(c(2L, 2L, 2L, 2L, 2L, 2L,
2L), levels = c("Não", "Sim"), class = "factor"), questao = c("Baixo número de candidatos(as) com a experiência necessária",
"Não há interesse nesse tipo de trabalho", "Falta de qualificação para as vagas",
"Muita competição de outras empresas pelos candidatos", "Distância e problemas de transporte",
"Salários baixos", "Outros"), n = c(0.249678269126242, 0.0882252727404921,
0.214696071646437, 0.0358608969946233, 0.0670295733380799, 0.0324488467977079,
0.0262572373795945), n_low = c(0.201005459494235, 0.0573694113878506,
0.168048082746628, 0.0143586248395167, 0.0409590734276312, 0.0142092731208629,
0.00961143386157624), n_upp = c(0.298351078758249, 0.119081134093134,
0.261344060546245, 0.0573631691497299, 0.0931000732485286, 0.0506884204745529,
0.0429030408976127)), row.names = c(NA, -7L), class = c("tbl_df",
"tbl", "data.frame"))





Используйте if вместо ifelse
Например
ggplot(aes(x = if (m_col == TRUE) reorder(var, -n) else var,
y = n,
ymin = n_low,
ymax = n_upp)) +
ifelse возвращает вектор, равный длине условия. Итак, ifelse(TRUE, 1:5, 10) возвращает только 1, потому что length(TRUE)==1. Не следует использовать ifelse для потока управления, на самом деле он предназначен только для преобразования векторов.
Зачем использовать ``m_col == TRUE` m_col уже TRUE или FALSE. так ты хочешь сказать if (m_col)
Спасибо! Я не знал, что можно использовать if внутри ggplot.