Распечатать, если не назначен
Как я могу записать в функцию способ определить, назначен ли вывод (<-
)? Я хотел бы напечатать сообщение, если оно не назначено, и просто переходит на консоль, но если он назначен, я бы хотел, чтобы он не печатал сообщение.
Вот пример фиктивного кода и то, как я бы хотел, чтобы он себя вел:
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)
being_assigned
в функции - это мнимое неизвестное условие, которое я хотел бы обнаружить, но не знаю, как это сделать.
Ответы
Ответ 1
Я думаю, что лучшее, что вы можете сделать, это определить специальный метод печати для объектов, возвращаемых функцией:
## 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)
>
Ответ 2
Я люблю идею Джоша, но для будущих плакатов хотелось показать, что я сделал, это слегка модифицированная версия его подхода. Его подход печатает информацию о классе, которая единственная, что мне не нравилось. Он использовал NextMethod
, чтобы избежать бесконечной рекурсивной печати. Это вызывает
attr(,"class")
[1] "myClass"
для печати. Поэтому, чтобы избежать этого, я сначала печатаю сообщение, а затем печатаю 1 по длине объекта класса (используя индексирование).
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
Еще раз спасибо Джошу за идею.
Если читателю не хотелось, чтобы маленький индекс [1]
печатал либо они могли cat
, он выводил вывод в качестве:
print.beep<- function(beep) {
cat(paste0(comment(beep), "\n"))
cat(beep[1:length(beep)], "\n")
}