Распечатать, если не назначен - программирование
Подтвердить что ты не робот

Распечатать, если не назначен

Как я могу записать в функцию способ определить, назначен ли вывод (<-)? Я хотел бы напечатать сообщение, если оно не назначено, и просто переходит на консоль, но если он назначен, я бы хотел, чтобы он не печатал сообщение.

Вот пример фиктивного кода и то, как я бы хотел, чтобы он себя вел:

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 в функции - это мнимое неизвестное условие, которое я хотел бы обнаружить, но не знаю, как это сделать.

4b9b3361

Ответ 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")
}