Encontrei um bug no gganimate
pacote que quebra um dos meus gráficos ( https://github.com/thomasp85/gganimate/issues/502 ). Sei como consertar se eu percorrer a função relevante no modo de depuração ( https://github.com/thomasp85/gganimate/issues/502#issuecomment-2395009593 ). Preciso executar esta linha de código:
data <- lapply(data, function(el){
el[order(el$x, decreasing = TRUE),]
})
logo após a linha 76 da gganimate:::ggplot_build.gganim
função ( https://github.com/thomasp85/gganimate/blob/b46d1ff9bfee89c33ca8d6c4fd3fa1074c649027/R/plot-build.R#L76 ). Claro, usar debug
só funciona se eu estiver executando o código interativamente. O que eu gostaria de fazer é corrigir essa função temporariamente para que meu gráfico saia corretamente quando eu estiver executando o código de forma não interativa (por exemplo, com knitr
).
Gostaria de obter um gráfico funcional enquanto aguardo uma correção de bug no pacote.
Eu estava pensando algo assim:
bdy = deparse(body(gganimate:::ggplot_build.gganim))
c(
bdy[1:41],
"data <- lapply(data, function(el){
el[order(el$x, decreasing = TRUE),]
})",
bdy[42:length(bdy)]
) -> bdy
f <- function(plot){}
body(f) <- as.expression(parse(text=paste0(bdy, collapse="\n")))
rlang::env_unlock(env = asNamespace('gganimate'))
rlang::env_binding_unlock(env = asNamespace('gganimate'))
assignInNamespace("ggplot_build.gganim", f, "gganimate")
rlang::env_binding_lock(env = asNamespace('gganimate'))
rlang::env_lock(asNamespace('gganimate'))
(juntando respostas https://stackoverflow.com/a/38732761/1129889 e https://stackoverflow.com/a/8502385/1129889 ) mas parece não funcionar, porque então não vê as gganimate
funções do pacote:
library(ggplot2)
library(gganimate)
library(ragg)
library(gifski)
dplyr::tibble(
x = seq(0,.5,length.out=256),
y = 1-pnorm(qnorm(x)/5)
) -> df
res = 300
w = 7
h = 4
# If this is run in knitr, w and h are in inches, otherwise
# they are in pixels
anim_w = ifelse(interactive(),w*res,w)
anim_h = ifelse(interactive(),h*res,h)
ggplot(df,aes(x=x,y=y)) +
geom_line() +
geom_point() +
coord_cartesian(
xlim=c(0,.5),ylim=c(.5,1),expand = FALSE
) -> gg
anim = gg + transition_reveal(x, range = c(.5,0))
## Try to hack the function in place
bdy = deparse(body(gganimate:::ggplot_build.gganim))
c(
bdy[1:41],
"data <- lapply(data, function(el){
el[order(el$x, decreasing = TRUE),]
})",
bdy[42:length(bdy)]
) -> bdy
f <- function(plot){}
body(f) <- as.expression(parse(text=paste0(bdy, collapse="\n")))
rlang::env_unlock(env = asNamespace('gganimate'))
rlang::env_binding_unlock(env = asNamespace('gganimate'))
assignInNamespace("ggplot_build.gganim", f, "gganimate")
rlang::env_binding_lock(env = asNamespace('gganimate'))
rlang::env_lock(asNamespace('gganimate'))
anim
produz o erro:
Error in plot_clone(plot) : could not find function "plot_clone"
(Suponho que seja porque plot_clone
é uma função interna para gganimate
)
Existe alguma maneira de fazer algo assim (ou realizar a mesma coisa de outra maneira)?
Observação: não quero bifurcar o pacote e inserir esta linha e então instalar minha versão dele (porque só preciso dessa correção temporária para um gráfico, e isso quebrará outras chamadas para a função).
O ideal seria fazer o garfo.
Sem a bifurcação (e seguindo o caminho que você escolheu), uma abordagem seria fazer cópias dos objetos {gganimate} não exportados em seu global via
:::
:Criado em 2024-10-05 com reprex v2.1.1
Use
trace
para inserir o código, executar plot euntrace
eletrace
é baseado em instruções e não em linhas de origem, então usamos 31 em vez de 76.A
print
declaração pode ser removida depois que você tiver certeza de que está inserindo o código no ponto correto. (Observe que naprint
declaração o segundo argumento deve ser FALSE, ou então ele exibirá a fonte original em vez da fonte rastreada.)