如何在不必存在参数的情况下设置R函数



我有一个函数,如果数据不可用,我想让它的参数是可选的。

我在这里展示了一个玩具的例子,但原理是一样的。

这是玩具数据。

X <- data.frame(row.names = c("Paladin", "Wizard", "Rouge"), 
"Score" = c(5, 4, 5))

Y <- data.frame("Class" = c("Wizard", "Barbarian", "Warlock"),
"Race" = c("Human", "Drow", "Half-orc"))

Z <- data.frame("Class" = c("Paladin", "Wizard", "Druid"),
"Race" = c("Human", "Human", "Half-elf"))

这是函数。

library(tidyverse)
MatrixMaker <- function(X, Y, Z){
df1 <- X %>% mutate(GAME1 = as.integer(rownames(X) %in% Y[[1]]))

rownames(df1) <- rownames(X)

df2 <- df1 %>% mutate(GAME2 = as.integer(rownames(df1) %in% Z[[1]]))

return(df2)
}
> MatrixMaker(X = X, Y = Y, Z = Z)
Level GAME1 GAME2
1     5     0     1
2     4     1     1
3     5     0     0

我希望Y和Z不能出现在函数中,函数仍然有效。该函数将添加一个0的新列,而不是Y或Z。

我尝试了下面的函数,但要么没有正确使用ifelse函数,要么这不是一个合适的方法。

MatrixMaker2 <- function(X, Y= NULL, Z = NULL){

if(Y = NULL){

df1$GAME1 <-0

} else {

df1 <- X %>% mutate(GAME1 = as.integer(rownames(X) %in% Y[[1]]))}

rownames(df1) <- rownames(X)

if(Z = NULL){

df2$GAME2 <- 0

} else {df2 <- df1 %>% mutate(GAME2 = as.integer(rownames(df1) %in% Z[[1]]))}

return(df2)
}

任何帮助都将不胜感激。

我认为这可以通过在基R中执行并使用missing来测试丢失的参数来简化:

MatrixMaker <- function(X, Y, Z)
{
X$GAME2 <- X$GAME1 <- numeric(nrow(X))
if(!missing(Y)) X$GAME1 <- as.integer(rownames(X) %in% Y[[1]])
if(!missing(Z)) X$GAME2 <- as.integer(rownames(X) %in% Z[[1]])
X
}

其行为如下:

MatrixMaker(X, Y, Z)
#>         Score GAME1 GAME2
#> Paladin     5     0     1
#> Wizard      4     1     1
#> Rouge       5     0     0
MatrixMaker(X, Y)
#>         Score GAME1 GAME2
#> Paladin     5     0     0
#> Wizard      4     1     0
#> Rouge       5     0     0
MatrixMaker(X)
#>         Score GAME1 GAME2
#> Paladin     5     0     0
#> Wizard      4     0     0
#> Rouge       5     0     0
MatrixMaker(X, Z = Z)
#>         Score GAME1 GAME2
#> Paladin     5     0     1
#> Wizard      4     0     1
#> Rouge       5     0     0

由reprex包于2020-07-29创建(v0.3.0(

相关内容

最新更新