Как создать функцию, которая будет возвращать другие функции на основе входных данных в R - PullRequest
0 голосов
/ 31 октября 2019

Итак, я пытаюсь создать функцию, которая принимает входные данные, а затем возвращает выходные данные на основе других созданных функций.

Подсказка:

Write a function variable_summary to detect the data type with inputs:
`x`: A vector
`groups`: A factor vector of the same length as x

The function should return:
`binary_summary(x, groups)` if x is binary
`numeric_summary(x, groups)` if x is numeric
`NULL` if x is neither binary nor numeric

Я понимаю основную идеюкак это сделать, но мне не хватает некоторых деталей.

Мой код:

variable_summary <- function(x, group) {
  if (all (x %in% 0:1)) {
    return(binary_summary(x,group))
}  else if (x %in% 0:max(x,na.rm = TRUE)) {
    return(numeric_summary(x,group))
} else {
    return("NULL")
  }
}

Хорошая новость заключается в том, что код, по крайней мере, выполняется, но я знаю, что что-то сделал неправильно, так как это становится проблематичным, когда используется для этого предоставленного блока:

format_variable_summary <- function(var_summary){
  options(scipen = 999) #to not use scientific notation
  if(is.null(var_summary)) {return(NULL)}
  out <- as.character(var_summary$missing)
  if(var_summary$is.binary){
    props <- as.character(round(100*var_summary$prop, 1))
    props <- paste(props, "%", sep="")
    out <- c(out, props, as.character(round(var_summary$p.value, 4)))
  } else {
    means <- as.character(round(var_summary$means, 2))
    sds <- as.character(round(var_summary$sds, 2))
    means_sds <- character(length(sds))
    for(i in 1:length(means_sds)){
      means_sds[i] <- paste(means[i], " (", sds[i], ")", sep = "")
    }
    out <- c(out, means_sds, as.character(round(var_summary$p.value, 4)))
  }
  options(scipen = 0) #sets back to the default: use scientifuc notation.
  return(out)
}

format_variable_summary(variable_summary(titanic4$age, titanic4$pclass))
format_variable_summary(variable_summary(titanic4$survived, titanic4$pclass))
format_variable_summary(variable_summary(titanic4$cabin, titanic4$pclass))
[1] "263"           "39.16 (14.55)" "29.51 (13.64)" "24.82 (11.96)"
[5] "0"            
[1] "0" "%" "0"
Error: $ operator is invalid for atomic vectors

Итак, я знаю, что мой numeric_summary работает, что-то не так с моим binary_summary, и нулевое назначение вообще не работает.

...