我有一个流畅的运行,但代码很长(这里没有包含),我希望通过在函数中使用多个函数来简化它。
我尝试了以下(缩短版)。如果我命名内部函数,即使我认为词法系统会找到'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
非常感谢任何建议。
答案 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=".")
}
这将有效