如何在不必存在参数的情况下设置 R 函数
How to set an R function where a parameter does not have to be present
我有一个函数,我想在数据不可用的情况下将其参数设置为可选。
我在这里展示了一个玩具示例,但原理是一样的。
这是玩具数据。
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。
我尝试了下面的功能,但要么没有正确使用 if
、else
功能,要么这不是合适的方法。
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)
}
如有任何帮助,我们将不胜感激。
我认为这可以通过在 base 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-07-29 创建
我有一个函数,我想在数据不可用的情况下将其参数设置为可选。
我在这里展示了一个玩具示例,但原理是一样的。
这是玩具数据。
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。
我尝试了下面的功能,但要么没有正确使用 if
、else
功能,要么这不是合适的方法。
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)
}
如有任何帮助,我们将不胜感激。
我认为这可以通过在 base 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-07-29 创建