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
.
Usando pipeR''s %>>%
esto debería ser muy fácil.
library(pipeR)
data.frame( x = c(1:3), y = (4:6)) %>>%
sum %>>%
(~ a)
El tutorial de pipeR puede ser útil: http://renkun.me/pipeR-tutorial/ Para la asignación: http://renkun.me/pipeR-tutorial/Pipe-operator/Pipe-with-assignment.html