在R中的函数内运行(命名)函数时出错

时间:2014-10-15 09:10:46

标签: r function

我有一个流畅的运行,但代码很长(这里没有包含),我希望通过在函数中使用多个函数来简化它。

我尝试了以下(缩短版)。如果我命名内部函数,即使我认为词法系统会找到'a',我会收到一条错误消息(对象'a'未找到)。

DF=data.frame(Loc1 <- c("C","A","A","A","B","C","B"),
          Loc2 <- c("a","a","b","b","a","a","b"),
          Dat1 <- c(1,1,1,1,1,1,1),
          Dat2 <- c(1,2,1,2,1,2,2),
          Dat3 <- c(2,2,4,4,6,5,3))

Inputs <- function(DF, a=NumFac, b=a)
      {
      NumFac <- length(DF[sapply(DF,is.factor)])
      Check()
      p = dim(DF)[2]-a
      Group <- apply(as.data.frame(DF[,1:b]), 1, paste, collapse=".")
      }

Check <- function()
      {
      if(a>=1 && a%%1==0 && b<=a && b>=1 && b%%1==0)
       {}
      else { stop("Incorrect number of factor columns") }
       }

Inputs(DF)
#Error in Check() : object 'a' not found
Inputs(DF,a=1.5)
#Error in Check() : object 'a' not found

如果我没有命名函数但是包含整个事情(虽然这样做并没有真正简化我的代码......)然后我没有得到错误,但是代码没有按预期工作。

Inputs <- function(DF, a=NumFac, b=a)
      {
      NumFac <- length(DF[sapply(DF,is.factor)])
      function()
       {
        if(a>=1 && a%%1==0 && b<=a && b>=1 && b%%1==0)
        {}
        else { stop("Incorrect number of factor columns") }
       }
      p = dim(DF)[2]-a
      Group <- apply(as.data.frame(DF[,1:b]), 1, paste, collapse=".")
      }

Inputs(DF)
#No error
Inputs(DF,a=1.5)
#No error but no 'stop' either

以下有效,但我不明白为什么前两次尝试没有。最后,我想在更大的'Inputs'函数中包含多个内部函数,我希望不需要为所有内部函数提供参数(看,因为它们都是相同的!)。

Inputs <- function(DF, a=NumFac, b=a)
      {
      NumFac <- length(DF[sapply(DF,is.factor)])
      Check(DF, a, b)
      p = dim(DF)[2]-a
      Group <- apply(as.data.frame(DF[,1:b]), 1, paste, collapse=".")
      }

Check <- function(DF, a, b)
      {
      if(a>=1 && a%%1==0 && b<=a && b>=1 && b%%1==0)
       {}
      else { stop("Incorrect number of factor columns") }
       }

Inputs(DF)
#No error
Inputs(DF,a=1.5)
#Error in Check(DF, a, b) :
#  Incorrect number of factor columns

非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

关于第二个问题:

Inputs <- function(DF, a=NumFac, b=a){
NumFac <- length(DF[sapply(DF,is.factor)])

if(a>=1 && a%%1==0 && b<=a && b>=1 && b%%1==0)
{}
else { stop("Incorrect number of factor columns") }
p = dim(DF)[2]-a
Group <- apply(as.data.frame(DF[,1:b]), 1, paste, collapse=".")
}

这将有效