R:迭代列表

时间:2017-04-22 19:26:36

标签: r singly-linked-list

我正在尝试在R中实现以下算法:

Iterate(Cell: top)
    While (top != null)
        Print top.Value
        top = top.Next
    End While
End Iterate

基本上,给定一个列表,即使列表没有结束,算法也应该在达到'null'时中断。

myls<-list('africa','america south','asia','antarctica','australasia',NULL,'europe','america north')

我必须为使用is.null()函数添加for循环,但是下面的代码是灾难,我需要你的帮助才能解决它。

Cell <- function(top) {
  #This algorithm examines every cell in the linked list, so if the list contains N cells,
  #it has run time O(N).
  for (i in 1:length(top)){
    while(is.null(top[[i]]) !=TRUE){
      print(top)
      top = next(top)
    }
  }
}

您可以使用以下方式运行此功能:

Cell(myls)

2 个答案:

答案 0 :(得分:4)

你很接近,但没有必要在此使用for(...) 构造

Cell <- function(top){
    i = 1
    while(i <= length(top) && !is.null(top[[i]])){
        print(top[[i]])
        i = i + 1
    }
}

如您所见,我在while循环中添加了一个额外条件:i <= length(top)这是为了确保您不会超出 如果没有空项,则列出。

但是你可以使用这种结构的for循环:

Cell <- function(top){
    for(i in 1:length(top)){
        if(is.null(top[[i]])) break
        print(top[[i]])
    }
}

或者,您可以在没有for / while构造的情况下使用此代码:

myls[1:(which(sapply(myls, is.null))[1]-1)]

答案 1 :(得分:1)

检查一下:它为myls中的所有值逐个运行并打印它们但是如果它遇到NULL值则会中断。

for (val in myls) {
  if (is.null(val)){
   break
  }
  print(val)
}  

如有任何疑问,请与我们联系。