1

我有一个函数,其中一部分内容如下:

conefor.input <- function(conefor.file, onlyoverall, probmin, index)
{
for(i in 1:l00)
{
cat(paste(conefor.file,
        if(onlyoverall=="TRUE")
                {onlyoverall<-"onlyoverall"},
distance,
        if(probmin=="TRUE")
            {probmin<-paste("-pcHeur", min)}, 
 index, sep="\t"),file="conef_command.txt", sep="\n")}
return("conef_command.txt")
}

我的目标是生成 100 行,其中每个输入都由一个选项卡分隔。

当上面的两个“if”语句为真时,没有问题。结果是:

conefor.file\tonlyoverall\tdistance\tpcHeur min\tindex

但是,当上面的两个“if”语句为假时,我会留下两个选项卡,其中“onlyoverall”和“pcHeur”本来应该是,而我真正想要的是根本不采取任何行动,并且只有一个选项卡分隔每个参数.

'if' 语句为假的示例:

conefor.file\t\tdistance\t\tindex

当'if'语句为假时我想要什么:

conefor.file\tdistance\tindex

提前谢谢了

4

1 回答 1

1

很难为您的for循环提出任何形式的矢量化或类似的建议,因为尚不清楚(至少对我而言)迭代之间有什么区别。

但是,对于paste里面的语句cat,可以改用下面的

paste(ifelse(onlyoverall, 
          paste(conefor.file, onlyoverall<-"onlyoverall", sep="\t"),
          conefor.file),
      ifelse(probmin, 
            paste(distance, probmin<-paste("-pcHeur", min), sep="\t"), 
            distance),
      index, 
      sep="\t")

请注意,这会在语句之前获取输出if并包含在ifelse输出中,在输出中同时给出TRUEFALSE

例如:

x1 <- x2 <- TRUE
paste(ifelse(x1, paste("A", "B" , sep="#"), "A"), ifelse(x2, paste("C", "D", sep="#"), "C"), "E", sep="#")
# [1] "A#B#C#D#E"

x1 <- x2 <- FALSE
paste(ifelse(x1, paste("A", "B" , sep="#"), "A"), ifelse(x2, paste("C", "D", sep="#"), "C"), "E", sep="#")
#  [1] "A#C#E"

x2 <- TRUE
paste(ifelse(x1, paste("A", "B" , sep="#"), "A"), ifelse(x2, paste("C", "D", sep="#"), "C"), "E", sep="#")
#  [1] "A#C#D#E"
于 2013-04-10T23:58:34.033 回答