not error could r magrittr

error - cómo alimentar el resultado de una cadena de tuberías(magrittr) a un objeto



could not find function view (5)

Lo que me gusta hacer (y encontré este truco en algún lugar que no puedo recordar) es usar {.} -> obj al final de mi cadena de tuberías. De esta manera, puedo agregar pasos adicionales al final de la cadena simplemente insertando una nueva línea, y no tengo que volver a posicionarme en -> operador de asignación.

También puede usar (.) lugar de {.} Pero parece un poco extraño .

Por ejemplo, en lugar de esto:

iris %>% ddply(.(Species), summarise, mean.petal = mean(Petal.Length), mean.sepal = mean(Sepal.Length)) -> summary

Hacer esto:

iris %>% ddply(.(Species), summarise, mean.petal = mean(Petal.Length), mean.sepal = mean(Sepal.Length)) %>% {.} -> summary

Facilita ver dónde terminan los datos canalizados. Además, aunque no parece ser un gran problema, es más fácil agregar otro paso final, ya que no es necesario mover el -> hacia abajo a una nueva línea, solo agregue una nueva línea antes de la {.} Y agregue el paso.

Al igual que:

iris %>% ddply(.(Species), summarise, mean.petal = mean(Petal.Length), mean.sepal = mean(Sepal.Length)) %>% arrange(desc(mean.petal)) %>% # just add a step here {.} -> summary

Sin embargo, esto no ayuda a guardar resultados intermedios. La respuesta de John Paul para usar assign () es buena, pero es un poco larga para escribir. Necesitas usar el . ya que los datos no son el primer argumento, debe poner el nombre del nuevo argumento en "" ''s, y especificar el entorno ( pos = 1 ). Parece perezoso por mi parte, pero usar %>% es sobre la velocidad .

Así que envolví el assign() en una pequeña función que lo acelera un poco:

keep <- function(x, name) {assign(as.character(substitute(name)), x, pos = 1)}

Así que ahora puedes hacer esto:

keep <- function(x, name) {assign(as.character(substitute(name)), x, pos = 1)} iris %>% ddply(.(Species), summarise, mean.petal = mean(Petal.Length), mean.sepal = mean(Sepal.Length)) %>% keep(unsorted.data) %>% # keep this step arrange(mean.petal) %>% {.} -> sorted.data sorted.data # Species mean.petal mean.sepal #1 setosa 1.462 5.006 #2 versicolor 4.260 5.936 #3 virginica 5.552 6.588 unsorted.data # Species mean.petal mean.sepal #1 setosa 1.462 5.006 #2 versicolor 4.260 5.936 #3 virginica 5.552 6.588

Esta es una pregunta bastante simple. Pero no pude encontrar la respuesta por google / stackexchange y mirando la documentación de magrittr. ¿Cómo alimenta el resultado de una cadena de funciones que se conectan a través de%>% para crear un vector?

Lo que vi hacer a la mayoría de la gente es:

a <- data.frame( x = c(1:3), y = (4:6)) %>% sum()

pero también hay una solución en la que puedo encadenar el resultado para alimentarlo a un objeto, tal vez un alias o algo parecido, algo así:

data.frame( x = c(1:3), y = (4:6)) %>% sum() %>% a <- ()

esto ayudaría a mantener todo el código en la misma lógica de enviar los resultados "hacia abajo".


Prueba esto:

data.frame( x = c(1:3), y = (4:6)) %>% sum -> a


Puedes hacerlo así:

data.frame( x = c(1:3), y = (4:6)) %>% sum %>% assign(x="a",value=.,pos=1)

Un par de cosas a anotar:

Puedes usar "." para decirle a magrittr qué argumento pertenece el objeto que se está adelantando. Por defecto, es el primero, pero aquí utilizo el . para indicar que lo quiero en el segundo argumento de value en su lugar.

Segundo, tuve que usar el argumento pos=1 para hacer la asignación en el entorno global.


También puede utilizar el operador <<-

data.frame( x = c(1:3), y = (4:6)) %>% sum() %>% `<<-`(a,.)

Edit: Creo que la sugerencia más segura es la de John Paul, y usted podría seguir con la cadena haciendo diferentes asignaciones de resultados parciales. Por ejemplo:

data.frame( x = c(1:3), y = (4:6)) %>% sum %>% assign(x="a",value=., pos=1) %>% exp %>% assign(x="b",value=., pos=1) %>% sqrt %>% assign(x="c", value=., pos=1)

Esto creará correctamente a , b y c .