Я работаю над функцией, у которой есть аргумент, который может принимать любую комбинацию значений в 0:2
Этот аргумент основан на системе "margin" функции prop.table
, но расширяет еепоэтому он может принимать несколько значений: 0 - это ячейка, 1 - это строка, 2 - это столбец, но 1: 2 - это строка и столбец, а 0: 2 - это строка, столбец и ячейка.
Я хочу уточнить этозапись, так что margin
может принимать свое значение в c("all", "line", "column", "cell", 0, 1, 2)
, с последними значениями, необходимыми для обратной совместимости.
Вот моя попытка использовать switch
(который, как я слышал, следует избегать):
ff = function(x, margin=c("all", "line", "column", "cell", 0, 1, 2)){
if(!is.numeric(margin)){
margin = switch(margin,
all = 0:2,
line = 1,
column = 2,
cell = 0)
if(is.null(margin)) margin=0:2 #defaulting
}
margin
}
ff(NULL, margin=1:2)
ff(NULL, margin="all")
ff(NULL, margin="cell")
ff(NULL, margin=c("column", "cell")) #error in switch (EXPR must be a length 1 vector)
Если поле имеет непредвиденное значение, оно будет по умолчанию 0: 2. Я бы предпочел использовать match.arg
, но я не мог заставить его принять вектор. Более того, как и сейчас, вектор по умолчанию будет приведен к символу.
Я также думал о замене «всего» на 0:2
и т. Д., А затем использовал unlist
и unique
, но не смог найтилюбая функция замены списка, которая работала здесь.