Объединение 3 функций в одну функцию - PullRequest
0 голосов
/ 19 февраля 2019

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

Я пытался переместить tbl1 и tbl2 в TBL.Fun.Это не будет работать.

TBL.fun <- function (x,y){
  if(length(y)==1) tbl1(x[,y])
  else if(length(y)==2) tbl2(x[,y[1]],x[,y[2]])
  else print("Only two columns of data, kiddo!")

}

tbl1 <- function(x){
  tbl <- ftable(x)
  ptbl<- round(prop.table(tbl)*100,2)
  out <- tbl
  out[] <- paste(tbl,"(",ptbl,"%)")
  return(out)
}

tbl2 <- function(x,y){
  tbl <- ftable(x,y)
  ptbl<- round(prop.table(tbl)*100,2)
  out <- tbl
  out[] <- paste(tbl,"(",ptbl,"%)")
  return(out)
}

Я хочу, чтобы TBL.fun проверил данные и на основании этой проверки вычислил и распечатал правильную таблицу.После того, как я объединил функции в

TBL.fun1 <- function (x,y=NULL){
  if(is.vector(x)==T && is.null(y)==T) tbl1(x)
  else tbl2(x,y)
  tbl1 <- function(x){
    tbl <- ftable(x)
    ptbl<- round(prop.table(tbl)*100,2)
    out <- tbl
    out[] <- paste(tbl,"(",ptbl,"%)")
    return(out)
  }

  tbl2 <- function(x,y){
    tbl <- ftable(x,y)
    ptbl<- round(prop.table(tbl)*100,2)
    out <- tbl
    out[] <- paste(tbl,"(",ptbl,"%)")
    return(out)
  }
}

После объединения функций я запустил dput() для функции с одной переменной.

Gender <- c("F","F","F","M","M","M")
Race <- c("Black","White","Asian","White","Black","Black")
> sam_dat <- cbind(Gender,Race)
dput(TBL.fun1(sam_dat[,1]))
function (x, y) 
{
    tbl <- ftable(x, y)
    ptbl <- round(prop.table(tbl) * 100, 2)
    out <- tbl
    out[] <- paste(tbl, "(", ptbl, "%)")
    return(out)
}
> TBL.fun1(sam_dat[,1])

1 Ответ

0 голосов
/ 19 февраля 2019

Вам не нужно включать все функции в TBL.fun1, вы просто вызываете их в зависимости от условия.

Вы также можете упростить условие, поскольку is.vector и is.null уже возвращают логические значения,так что вам не нужно проверять на == TRUE.

Я вставил 2 оператора печати, поэтому вы можете видеть, что обе функции вызываются.

TBL.fun1 <- function (x, y = NULL){
  if (is.vector(x) && is.null(y)) {
    print("used tbl1")
    tbl1(x) 
  } else {
    print("used tbl2")
    tbl2(x, y)
  }
}

Gender <- c("F","F","F","M","M","M")
Race <- c("Black","White","Asian","White","Black","Black")
sam_dat <- cbind(Gender,Race)

a = TBL.fun1(sam_dat[,1])
b = TBL.fun1(sam_dat[,2], sam_dat[,1])
...