【问题标题】:How to set an R function where a parameter does not have to be present如何在不必存在参数的情况下设置 R 函数
【发布时间】:2020-11-19 04:10:54
【问题描述】:

我有一个函数 where 我想让它的参数可选,以防数据不可用。

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

这是玩具数据。

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

任何帮助将不胜感激。

【问题讨论】:

  • 您无法使用==NULL 进行比较,请尝试1 == NULL 看看会发生什么。您需要使用is.null。但是,我建议不要设置默认值 NULL,而是使用 missing

标签: r function optional-parameters


【解决方案1】:

我认为这可以通过在基础 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 package (v0.3.0) 于 2020 年 7 月 29 日创建

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 2018-07-13
    • 2012-11-30
    • 2020-09-10
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多