tag - departamento de vehiculos y motores de la florida
imprimir si no esta asignado (2)
¿Cómo puedo escribir en una función una forma de detectar si la salida se está asignando ( <-
) a algo? El razonamiento es que me gustaría imprimir un mensaje si no está siendo asignado y solo va a la consola, pero si está siendo asignado, me gustaría que no imprima el mensaje.
Aquí hay un ejemplo ficticio y cómo me gustaría que se comportara:
fun <- function(x) {
if (being_assigned) {
print("message")
}
return(x)
}
#no assignment so message prints
> fun(6)
[1] "message"
[1] 6
#assignment so message does not prints
> x <- fun(6)
El estar being_assigned
en la función es la condición imaginaria desconocida que me gustaría detectar pero no sé cómo.
Creo que lo mejor que puede hacer es definir un método de impresión especial para los objetos devueltos por la función:
## Have your function prepend "myClass" to the class of the objects it returns
fun <- function(x) {
class(x) <- c("myClass", class(x))
x
}
## Define a print method for "myClass". It will be dispatched to
## by the last step of the command line parse-eval-print cycle.
print.myClass <- function(obj) {
cat("message/n")
NextMethod(obj)
}
> fun(1:10)
message
[1] 1 2 3 4 5 6 7 8 9 10
attr(,"class")
[1] "myClass"
>
> out <- fun(1:10)
>
Me encanta la idea de Josh, pero para futuros carteles quería mostrar lo que hice, que es una versión ligeramente modificada de su enfoque. Su enfoque imprime la información de la clase, que es lo único que no me gustó. Utilizó el NextMethod
para evitar la impresión de recursión infinita. Esto causa la
attr(,"class")
[1] "myClass"
para ser impreso Así que para evitar esto, primero imprimo el mensaje y luego imprimo 1 a lo largo del objeto de la clase (utilizando la indexación).
fun <- function(x) {
class(x) <- ''beep''
comment(x) <- "hello world"
return(x)
}
print.beep<- function(beep) {
cat(paste0(comment(beep), "/n"))
print(beep[1:length(beep)])
}
> fun(1:10)
hello world
[1] 1 2 3 4 5 6 7 8 9 10
Gracias de nuevo Josh por la idea.
Si el lector no quisiera que se imprimiera el pequeño índice [1]
, podrían cat
la salida en la declaración de impresión como:
print.beep<- function(beep) {
cat(paste0(comment(beep), "/n"))
cat(beep[1:length(beep)], "/n")
}