如何在R中重载功能参数?

Léo*_* 준영 0 r

简化代码所在的两个参数agegender; 但是,我只想通过gender或选择案件age; 我在想如何一次又一次地重载getIDs(age)getIDs(gender)不重复相同的代码; 假设您有50个参数等; 我尝试过,getIDs(age, "")但这不是一个好主意

getIDs <- function(age, gender) {
    # https://stackoverflow.com/a/40330110/54964

    ageIDs <- c(1,2,3)
    genderIDs # dummy code here to indicate that do not use genderIDs if gender ""

    intersect(ageIDs, genderIDs)
}
Run Code Online (Sandbox Code Playgroud)

主要数据

ID,Age,Gender
100,69,male
101,75,female
102,84,female
103,,male
104,66,female
Run Code Online (Sandbox Code Playgroud)

数据2

DF <- structure(list(ID = 100:104, Age = c(69L, 75L, 84L, NA, 66L), Gender = 
c("male", "female", "female", "male", "female")), .Names = c("ID", "Age", 
"Gender"), row.names = c(NA, -5L), class = "data.frame") 
Run Code Online (Sandbox Code Playgroud)

同样适用于年龄:如果age=="",不包括subsetageIDs.

所有男性的一些参数都很棒,因此您不需要明确地做"male", "male", ....

基于罗马答案的算法

我认为这个策略对50个参数非常具有挑战性,因此仍然需要更好的方法

getIDs <- function(age, gender) {
# https://stackoverflow.com/a/40330110/54964
# So if you called this as getIDs(c(20, 30), "male")
# You'd get the ids of all males with age >= 20 and <= 30
# 
# NULL = ALL
# getIDs(age = c(1,2), gender = NULL)
# getIDs(age = NULL, gender = "male")
        data <- read.csv("/home/masi/data.csv",header = TRUE,sep = ",")

        if (is.null(gender)) {
                genderIDs <- data$ID
        } else {
                gender <- data$Gender == gender
                genderIDs <- data[which(gender), ]$ID
        }

        if (is.null(age)) {
                age <- c(0,130)
        }
        if (length(age) == 1) {
                ages <- data$Age == age
        } else {
                ages <- (data$Age >= age[1] & data$Age <= age[2])
        }
        ageIDs <- data[which(ages), ]$ID

        intersect(ageIDs, genderIDs)
}
Run Code Online (Sandbox Code Playgroud)

操作系统:Debian 8.5
R:3.1.1

Rom*_*rik 5

您可以为参数指定默认值并将其捕获到下游.

例如,如果你制作age = NULL,你可以使用它

if (is.null(age)) {
    # do something
}
Run Code Online (Sandbox Code Playgroud)

其他参数也是如此.另一个很好的选择是使用NA,捕获is.na功能.

编辑

在讨论之后,在任何情况下,五十个参数都是完整的手.根据您的需要,您有多种选择.

如果所有参数都具有相同的数据类型,则可以使用命名向量,例如

x <- c(arg1 = "1", arg2 = "this")
Run Code Online (Sandbox Code Playgroud)

如果您有不同的数据类型,并且您不希望它们被强制转换为一种类型(数字将被强制转换为字符,如果一个参数是字符,请尝试c(1, "2")),您可以使用列表.

x <- list(par1 = 1,
          par2 = "2",
          par3 = factor(3),
          par4 = TRUE)
Run Code Online (Sandbox Code Playgroud)

使用列表在R中非常自然,您可以使用eg sapplylapply.您可以找到所有数值

> x[sapply(x, is.numeric)]
$par1
[1] 1
Run Code Online (Sandbox Code Playgroud)

或仅仅基于名称

> x[grepl(paste("par", 1:2, sep = "", collapse = "|"), names(x))]
$par1
[1] 1

$par2
[1] "2"
Run Code Online (Sandbox Code Playgroud)