Learn R Programming

nanonext

R binding for NNG (Nanomsg Next Gen), a successor to ZeroMQ. NNG is a socket library for reliable, high-performance messaging over in-process, IPC, TCP, WebSocket and secure TLS transports. Implements ‘Scalability Protocols’, a standard for common communications patterns including publish/subscribe, request/reply and service discovery.

As its own threaded concurrency framework, provides a toolkit for asynchronous programming and distributed computing. Intuitive ‘aio’ objects resolve automatically when asynchronous operations complete, and synchronisation primitives allow R to wait upon events signalled by concurrent threads.

Designed for performance and reliability, nanonext is a lightweight wrapper around the NNG C library, and is itself implemented almost entirely in C.

Provides the interface for code and processes to communicate with each other - receive data generated in Python, perform analysis in R, and send results to a C++ program – on the same computer or across networks spanning the globe.

Implemented scalability protocols:

Supported transports:

  • inproc (intra-process)
  • IPC (inter-process)
  • TCP (IPv4 or IPv6)
  • WebSocket
  • TLS (over TCP and WebSocket)

Development of the TLS implementation was generously supported by the .

Web utilities:

  • ncurl - (async) http(s) client
  • stream - secure websockets client / generic low-level socket interface
  • ip_addr() - for retrieving all local network IP addresses by interface
  • messenger() - console-based instant messaging with authentication

Quick Start

nanonext offers 2 equivalent interfaces: a functional interface, and an object-oriented interface.

Functional Interface

The primary object in the functional interface is the Socket. Use socket() to create a socket and dial or listen at an address. The socket is then passed as the first argument of subsequent actions such as send() or recv().

Example using Request/Reply (REQ/REP) protocol with inproc transport: (The inproc transport uses zero-copy where possible for a much faster solution than alternatives)

Create sockets:

library(nanonext)

socket1 <- socket("req", listen = "inproc://nanonext")
socket2 <- socket("rep", dial = "inproc://nanonext")

Send message from ‘socket1’:

send(socket1, "hello world!")
#> [1] 0

Receive message using ‘socket2’:

recv(socket2)
#> [1] "hello world!"

Object-oriented Interface

The primary object in the object-oriented interface is the nano object. Use nano() to create a nano object which encapsulates a Socket and Dialer/Listener. Methods such as $send() or $recv() can then be accessed directly from the object.

Example using Pipeline (Push/Pull) protocol with TCP/IP transport:

Create nano objects:

library(nanonext)

nano1 <- nano("push", listen = "tcp://127.0.0.1:5555")
nano2 <- nano("pull", dial = "tcp://127.0.0.1:5555")

Send message from ‘nano1’:

nano1$send("hello world!")
#> [1] 0

Receive message using ‘nano2’:

nano2$recv()
#> [1] "hello world!"

Vignette

Please refer to the nanonext vignette for full package functionality.

This may be accessed within R by:

vignette("nanonext", package = "nanonext")

Installation

Install the latest release from CRAN:

install.packages("nanonext")

Or the current development version from R-universe:

install.packages("nanonext", repos = "https://r-lib.r-universe.dev")

Building from Source

Linux / Mac / Solaris

Installation from source requires ‘libnng’ >= v1.9.0 and ‘libmbedtls’ >= 2.5.0 (suitable installations are automatically detected), or else ‘cmake’ to compile ‘libnng’ v1.11.0 and ‘libmbedtls’ v3.6.2 included within the package sources.

It is recommended for optimal performance and stability to let the package automatically compile bundled versions of ‘libmbedtls’ and ‘libnng’ during installation. To ensure the libraries are compiled from source even if system installations are present, set the NANONEXT_LIBS environment variable prior to installation e.g. by Sys.setenv(NANONEXT_LIBS = 1).

As system libraries, ‘libnng’ is available as libnng-dev (deb) or nng-devel (rpm), and ‘libmbedtls’ as libmbedtls-dev (deb) or libmbedtls-devel (rpm). The INCLUDE_DIR and LIB_DIR environment variables may be set prior to package installation to specify a custom location for ‘libmbedtls’ or ‘libnng’ other than the standard filesystem locations.

Additional requirements for Solaris: (i) the ‘xz’ package - available on OpenCSW, and (ii) a more recent version of ‘cmake’ than available on OpenCSW - refer to the ‘cmake’ website for the latest source file.

Windows

On Windows, ‘libnng’ v1.11.0 and ‘libmbedtls’ v3.6.2 will be compiled from the package sources during installation and hence requires the ‘Rtools’ toolchain.

For R >= 4.2 using the ‘Rtools42’ or newer toolchains, the prerequisite ‘cmake’ is included. For previous R versions using ‘Rtools40’ or earlier, it may be necessary to separately install a version of ‘cmake’ in Windows and ensure that it is added to your system’s PATH.

Acknowledgements and Links

We would like to acknowledge in particular:

  • Garrett D’Amore, author of the NNG library, for generous advice and for implementing a feature request specifically for a more efficient ‘aio’ implementation in nanonext.
  • The R Consortium for funding the development of the secure TLS capabilities in the package, and Henrik Bengtsson and Will Landau’s roles in making this possible.
  • Joe Cheng for prototyping the integration of nanonext with later to support the next generation of completely event-driven ‘promises’.
  • Luke Tierney (R Core) and Mike Cheng for meticulous documentation of the R serialization mechanism, which led to the package’s own implementation of a low-level interface to R serialization.
  • Travers Ching for a novel idea in extending the original custom serialization support in the package.
  • Jeroen Ooms - for his ‘Anticonf (tm)’ configure script, on which our original ‘configure’ was based, although much modified since.

Links:

◈ nanonext R package: https://nanonext.r-lib.org/

nanonext is listed in CRAN Task Views:

NNG: https://nng.nanomsg.org/ Mbed TLS: https://www.trustedfirmware.org/projects/mbed-tls/

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

Copy Link

Version

Install

install.packages('nanonext')

Monthly Downloads

7,806

Version

1.6.1

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Charlie Gao

Last Published

June 23rd, 2025

Functions in nanonext (1.6.1)

ncurl_session

ncurl Session
.interrupt

Interrupt Switch
recv

Receive
recv_aio

Receive Async
nng_error

Translate Error Codes
reap

Reap
read_stdin

Read stdin
nng_version

NNG Library Version
.keep

Keep Promise
pipe_id

Get the Pipe ID of a recvAio
pipe_notify

Pipe Notify
status_code

Translate HTTP Status Codes
stop_aio

Stop Asynchronous Aio Operation
request

Request over Context (RPC Client for Req/Rep Protocol)
serial_config

Create Serialization Configuration
parse_url

Parse URL
reply

Reply over Context (RPC Server for Req/Rep Protocol)
messenger

Messenger
stream

Open Stream
monitor

Monitor a Socket for Pipe Changes
opt

Get and Set Options for a Socket, Context, Stream, Listener or Dialer
socket

Open Socket
transports

Transports (Documentation)
subscribe

Subscribe / Unsubscribe Topic
zzz

Internal Package Function
unresolved

Query if an Aio is Unresolved
tls_config

Create TLS Configuration
send

Send
send_aio

Send Async
survey_time

Set Survey Time
is_aio

Validators
write_cert

Generate Self-Signed Certificate and Key
write_stdout

Write to Stdout
nano

Create Nano Object
msleep

Sleep Utility
is_error_value

Error Validators
start

Start Listener/Dialer
random

Random Data Generation
stat

Get Statistic for a Socket, Listener or Dialer
protocols

Protocols (Documentation)
cv

Condition Variables
.context

Technical Utility: Open Context
collect_aio

Collect Data of an Aio or List of Aios
dial

Dial an Address from a Socket
context

Open Context
close.nanoContext

Close Connection
call_aio

Call the Value of an Asynchronous Aio Operation
.advance

Advances the RNG State
%~>%

Signal Forwarder
ip_addr

IP Address
.read_header

Serialization Headers and Markers
.unresolved

Technical Utility: Query if an Aio is Unresolved
as.promise.recvAio

Make recvAio Promise
as.promise.ncurlAio

Make ncurlAio Promise
listen

Listen to an Address from a Socket
ncurl

ncurl
nanonext-package

nanonext: NNG (Nanomsg Next Gen) Lightweight Messaging Library
mclock

Clock Utility
ncurl_aio

ncurl Async