【问题标题】:Combining 3 functions into one function将 3 个功能组合为一个功能
【发布时间】:2019-07-13 05:24:02
【问题描述】:

我正在尝试设置一个检查数据然后运行相应函数的函数。

我尝试将 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])

【问题讨论】:

  • 您能提供dput() 的数据吗?
  • 什么是 dput()?
  • 如果您在用于运行TBL.fun() 的变量上使用函数dput(),我们可以重现该错误。 dput() 返回变量的结构,因此其他人可以将其粘贴到他们的 R 控制台上并具有完全相同的变量。

标签: r function nested-function


【解决方案1】:

您不必在TBL.fun1 中包含所有函数,您只需根据条件调用它们即可。

您还可以将条件简化为is.vectoris.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])

【讨论】:

  • 谢谢,最终目标是构建一个我一直使用的函数包,我认为所有位都必须在一个函数中。
  • 只要函数在同一个文件中并且在你执行TBL.fun1之前加载,你不需要做任何事情,如果它们在不同的文件中,你必须source他们在你的环境中。但是,如果您构建一个包,则这些功能必须在包中并且可以在任何地方访问(只要您导出它们,否则它们只能从您的包内部访问)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多