2017-05-03 224 views
1

我想知道如何修改下面的代码重复的功能的7倍。我不能使用replicate(7, func(f)),因为我需要一个可以选择重复次数的选项。我的意思是,一个函数询问我是否想继续。重复定义函数达到n次

假设

speed<-cars$speed 
dist<-cars$dist 
level<-c(1:50) 
f<-data.frame(speed,dist,level) 
plot(speed, dist, main="Milage vs. Car Weight", 
    xlab="Weight", ylab="Mileage", pch=18, col="blue") 
text(speed, dist, row.names(f), cex=0.6, pos=4, col="red") 

这是我的功能

func = function(A){ 
id.co1 <- identify(f$speed, f$dist,labels=row.names(f), n = 2, pos = TRUE,plot = TRUE) 
xy <- f[c(id.co1$ind[1],id.co1$ind[2]),] 
lines(xy, col="red", lwd=5) 
lm(dist~speed, xy) 
abline(coef(lm(dist~speed, xy)),col="blue") 
x.co1 <- f$speed[id.co1$ind[1]:id.co1$ind[2]] 
y.co1 <- f$dist[id.co1$ind[1]:id.co1$ind[2]] 
m.co1 <- lm(y.co1 ~ x.co1) 
} 
+0

虽然看起来你有一个可重复的例子,但“汽车”是未知的。在空R脚本中自己尝试一下。 – Parfait

+0

@Parfait,运行require(stats);需要(图形),那么你将有权访问汽车数据集。 – Marco

+0

你确定吗?这些是基本软件包,应该已经可用。请使用所有相关的'library'或'require'行和对象分配来更新您的代码。在干净的新R环境中测试可重复性。经常看到[引文](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – Parfait

回答

1

如果我理解正确的,你想指定多久重复功能的执行交互,而不是编程。你可以用readline做到这一点:

我需要一个函数,它给了我一些选项可以选择重复

# some function 
funcA <- function(){ 
cat("i am funcA\n") 
} 
# some function that interactively repeats funcA a specified amount of times 
doNTimesA <- function() { 
    Ntimes <- readline("number of repeats: ") 
    for (i in 1:Ntimes) funcA() 
} 
doNTimesA() 

我指的数量,这会询问我是否想要一个功能继续或不

funcB <- function(){ 
    while (TRUE) { 
    cat("i am funcB\n") 
    continue <- readline("again? y/n: ") 
    if (tolower(continue)=="n") break 
    } 
    cat("funcB is done") 
} 
funcB() 

编辑:为你r特定情况下,可以将函数声明包装在while循环中,该循环会询问您是否要继续,如上例中的示例funcB。更新在那里还保存其输出:

func <- function(){ 
#initiate an iteration counter and an outputlist 
    counter <- 1 
    output <- list() 
#start an infinite loop 
    while (TRUE) { 
#do your thing  
    id.co1 <- identify(f$speed, f$dist,labels=row.names(f), n = 2, pos = TRUE,plot = TRUE) 
    xy <- f[c(id.co1$ind[1],id.co1$ind[2]),] 
    lines(xy, col="red", lwd=5) 
    lm(dist~speed, xy) 
    abline(coef(lm(dist~speed, xy)),col="blue") 
    x.co1 <- f$speed[id.co1$ind[1]:id.co1$ind[2]] 
    y.co1 <- f$dist[id.co1$ind[1]:id.co1$ind[2]] 
    m.co1 <- lm(y.co1 ~ x.co1) 
#store the result at counter index in the outputlist 
    output[[counter]] <- list(xco =x.co1, yco=y.co1, lm =m.co1) 
    counter <- counter+1 
#prompt for next iteration 
    continue <- readline("again? y/n: ") 
#break the loop if the answer is 'n' or 'N' 
    if (tolower(continue)=="n") break 

    } 
#return your output 
    output 
} 

现在会发生什么情况是,每次迭代后,该功能会询问是否要重新运行功能:continue <- readline("again? y/n: "),并检查是否已回答Nn。如果您愿意,您可以在答案上添加更多检查;如果您现在回答了除Nn之外的任何内容,则循环将再次运行。

如果运行all <- func(),大功告成后,您可以使用all[[1]]all[[2]]访问每个迭代结果,等

请注意,它通常令人难以接受的操控自己的功能环境之外的对象,所以它会将初始绘图生成插入到您的函数中会更清洁。

+0

非常感谢您的帮助,我对这个解决方案感到有点困惑 我想选择鼠标点击不同的间隔(点)。我想要的 是选择每两个点并用直线连接后,系统询问我是否要继续并选择另一对点。 如果我说是,那么我可以选择另外两个点,如果我说不是系统会给我最后两个选择的价值。 – Marco

+0

func是我制作的一个功能,我想根据我想要的次数重复一次(通过回答yes还是不是我是否要继续) – Marco

+0

小例子是展示如何去做添加一个“你想继续”选项的功能,或添加一个“我想指定多久我想做这个”选项。 –