De acuerdo con el libro de H. Wickham Paquetes R , en el capítulo Metadatos del paquete, sobre cómo agregar una dependencia de paquete, Hadley señala buenas razones para referirse explícitamente a funciones externas utilizando la sintaxis package::function().

Agregar una dependencia de paquete aquí asegura que se instalará. Sin embargo, no significa que se adjuntará junto con su paquete (es decir, la biblioteca (x)). La mejor práctica es hacer referencia explícita a funciones externas utilizando el paquete de sintaxis :: function () . Esto hace que sea muy fácil identificar qué funciones viven fuera de su paquete. Esto es especialmente útil cuando lea su código en el futuro.

De Paquetes R | Metadatos del paquete.

Pero, ¿cómo hacerlo cuando function es un operador infijo? Por ejemplo, ¿parece que no puedo hacer 1:10 magrittr::"%>%" sqrt? Y adoptar un estilo de función aquí desafiaría el propósito de usar el operador de tubería ... ¿no es así?

2
rmagno 23 mar. 2017 a las 19:43

2 respuestas

La mejor respuesta

Creo que estaría seguro usando la importación de magrittr allí. Pero si quisieras, puedes asegurarte de que tu símbolo se refiere al que quieres haciendo

your_fun <- function(){
  `%>%` <- magrittr::`%>%`
  # now use %>% like you normally would
  # and you can be sure it refers to the magrittr version.
  return(42)
}
2
Dason 23 mar. 2017 a las 16:52

No puede usar package::infix con la sintaxis infija, pero puede usar operadores infija con sintaxis estándar. Por ejemplo:

"+"(1, 2)
# [1] 3

Hmisc::"%nin%"(1:3, 2)
# [1]  TRUE FALSE  TRUE

Desafortunadamente, esto no funciona con magrittr cuando el paquete no está cargado, probablemente debido a sus trucos de sustitución.

## what a shame that this beauty doesn't work:
magrittr::"%>%"(1:5, mean)
# Error in pipes[[i]] : subscript out of bounds

library(magrittr)
"%>%"(1:5, mean)
# [1] 3

En un contexto de paquete, recomendaría simplemente importar magrittr, o al menos importar "%>%".


La fuente que cita es lo suficientemente buena como para explicar algunos de los razonamientos detrás de esta mejor práctica:

Esto hace que sea muy fácil identificar qué funciones viven fuera de su paquete. Esto es especialmente útil cuando lea su código en el futuro.

Esto no parece aplicarse en este caso. Es poco probable que olvide dónde vino %>% o que piense erróneamente que está creado en su paquete.

2
Gregor Thomas 23 mar. 2017 a las 16:56