foreach包中列表的结构

时间:2017-02-17 23:23:58

标签: r list foreach

我在foreach包中发现了一个功能/错误,我不明白。也许有人可以解释我这种行为:

我使用foreach包创建了一个for循环(我将它们与mutlicore计算一起使用,但这里只是在一个sequentiell示例中,错误出现在两个变体中)。此循环运行r次。在每次运行中,都会返回包含c条目的列表。所以我希望列表中包含r个条目,每个条目都包含c个列表。

我的代码如下:

library(foreach)

clusters <- 10
runs <- 100

temp <- foreach(r = 1:runs,
                .combine = 'list',
                .multicombine = TRUE) %do% {

              signal_all <- lapply(1:clusters, function(x){

                return(1)

              })

              return(signal_all)
            } ## end do

使用此代码,所有代码均按预期工作,请参见下图:

enter image description here

但是当增加runs <- 101时,输出temp就是:

enter image description here

预期的列表结构被销毁。但是当评论出.combine = 'list'行时,所有内容都按预期工作。

library(foreach)

clusters <- 10
runs <- 100

temp <- foreach(r = 1:runs,
                .multicombine = TRUE) %do% {

              signal_all <- lapply(1:clusters, function(x){

                return(1)

              })

              return(signal_all)
            } ## end do

enter image description here

有人可以解释这种行为吗? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:5)

与此同时,我找到了解决方案。

foreach函数知道某些comine函数(例如 // Creates connections to other Nodes(machines) and sends messages public class Node { public static volatile int timestamp = 0; public static volatile int highestTimestamp = 0; public static int csCounter = 0; public static int nodeId; public static int n; public static String[] hosts; public static int[] ports; public static volatile int[] deferredNodes; public static volatile boolean requestingCS = false; public static volatile int outstandingReplies; // skipping getters and setters for variables shared between server and client threads // method to connect the node with other nodes public static Connection connect() { // skipping standar code to create sockets } public static void main(String[] args) { // start the receiver Server server = new Server(); server.start(); // make the connections with other nodes Connection connections = connect(); while (counter <= 2) { // create a message Message message = new Message(); // skipping details to create a msg // send requests to all other nodes for (int i = 0; i < n; i++) { if (i != nodeId) { System.out.println("Sending message " + message + " to node " + i); try { connections.outs[i].writeObject(message); outstandingReplies++; } catch (Exception e) { e.printStackTrace(); } } } // All REQUEST messages sent, WAIT for all replies while (outstandingReplies != 0) { // System.out.println("Waiting for replies"); } // send REPLY msg based on some logic if(logic is true){ // send messages to other nodes Message replyMessage = new Message("REPLY", timestamp, nodeId); try { connections.outs[i].writeObject(replyMessage); } catch (IOException e) { e.printStackTrace(); } } } Connections Class // Stores all the connections created by the Node Class Server Class // Listens to requests from nodesand spawns a Processor thread for each socket public class Server extends Thread { @Override public void run() { try { System.out.println("Starting the node's receiver thread"); // create a serversocket to listen to requests ServerSocket serverSocket = new ServerSocket(Node.ports[Node.nodeId]); for (int i = 0; i < Node.n - 1; i++) { System.out.println("Opening sockets"); Socket socket = serverSocket.accept(); // create a processor thread for each to read and process the incoming Messages Processor processor = new Processor(socket); System.out.println("Starting message processor"); processor.start(); } } catch (IOException e) { e.printStackTrace(); } } Processor Class // Processes the messages and sends reply when needed public class Processor extends Thread { Socket socket; int[] replies = new int[10]; public Processor(Socket socket) { this.socket = socket; } @Override public void run() { try { ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); ObjectOutputStream out = new ObjectOutputStream( socket.getOutputStream()); while (true) { System.out.println("Waiting for msg"); System.out.println("Socket is " + socket.isConnected()); Message message = (Message) in.readObject(); Node.timestamp = Math.max(Node.timestamp + 1, message.timestamp); // printing the queue here System.out.println("Processor received " + message); // if message is a request if (message.type.trim().equals("REQUEST")) { if(condition is true){ // do something } else { // send reply to node who sent you message Message replyMessage = new Message("REPLY", Node.timestamp, Node.nodeId); System.out.println( "Send " + replyMessage + " to " + Node.hosts[message.nodeId]); out.writeObject(replyMessage); } } if (message.type.trim().equals("REPLY")) { // do something } } } catch (Exception e) { e.printStackTrace(); } } c)接受许多参数,并且将使用最多100个参数(默认情况下)调用它们以提高性能。使用参数cbind,您可以手动设置它们。

.maxcombine