R передает "пустые" или "отсутствующие" аргументы в функцию пакета с помощью оператора if else - PullRequest
0 голосов
/ 27 апреля 2020

Моя конкретная проблема c связана с использованием heatmap.2 с блестящим сервером, но я думаю, что этот вопрос применим в других местах.

Я хочу сделать аргумент необязательным, но сам аргумент не ' не может иметь значение по умолчанию NULL / FALSE из того, что я могу собрать. Я пытаюсь сделать это с опциями RowSideColors и ColSideColors из heatmap.2.

Кажется, что определение аргумента и оставление его пустым работает, а также создание отсутствующего_арга через rlang. Но когда вы включаете любой из них в оператор if, heatmap.2 это не нравится.

Есть идеи?

library(rlang)
library(gplots)

data(mtcars)
x  <- as.matrix(mtcars)

missing <-missing_arg()
row_clusters <- 0

#works
heatmap.2(x, RowSideColors= )
heatmap.2(x, RowSideColors= missing )

#doesn't work
heatmap.2(x, RowSideColors= FALSE)
heatmap.2(x, RowSideColors= NULL)
heatmap.2(x, RowSideColors= NA)
heatmap.2(x, RowSideColors= NaN)
heatmap.2(x, if(row_clusters == 0)RowSideColors= )
heatmap.2(x, if(row_clusters == 0)RowSideColors= missing )
heatmap.2(x, RowSideColors= if(row_clusters == 0){missing}else{})
heatmap.2(x, RowSideColors= if(row_clusters == 0) missing else missing)
etc...

Для контекста, вот что происходит в фоновом режиме для RowSideColors и ColSideColors в heatmap.2:

if(!missing(ColSideColors)) { ## add middle row to layout
        if(!is.character(ColSideColors) || length(ColSideColors) != nc)
          stop("'ColSideColors' must be a character vector of length ncol(x)")

1 Ответ

1 голос
/ 27 апреля 2020

Я был удивлен heatmap.2(x, RowSideColors= if(row_clusters == 0) missing else missing) не сработало ... Я думаю, что проблема в missing_arg это fr agile ... см. Хрупкость отсутствующего аргумента объекта раздел ?missing_arg. Это работает:

rowside_arg <- if(row_clusters == 0) missing_arg() else missing_arg()
heatmap.2(x, RowSideColors = arg)
...