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

如何在不必存在参数的情况下设置R函数,r,function,optional-parameters,R,Function,Optional Parameters,我有一个函数,我想让它的参数可选的情况下,数据是不可用的 我在这里展示了一个玩具示例,但原理是一样的 这是玩具数据 X <- data.frame(row.names = c("Paladin", "Wizard", "Rouge"), "Score" = c(5, 4, 5)) Y <- data.frame("Class" = c("

我有一个函数,我想让它的参数可选的情况下,数据是不可用的

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

这是玩具数据

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"))


任何帮助都将不胜感激。

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


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

MatrixMaker无法使用==与NULL进行比较,请尝试1==NULL,然后查看发生了什么。您需要使用is.null。但是,我建议不要将默认值设置为NULL,而是使用missing。您不能使用==、try 1==NULL与NULL进行比较,然后看看会发生什么。您需要使用is.null。但是,我建议不要将默认值设置为NULL,而是使用missing。
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
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)
}

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