Как эффективно заменить аргументы в функции? - PullRequest
1 голос
/ 01 декабря 2019

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

...