Nothing
      ## Adapted from Qt's AddressBook tutorial
library(qtbase)
qsetClass("AddressBook", Qt$QWidget, function(parent = NULL) {
  super(parent)
  
  nameLabel <- Qt$QLabel("Name:")
  this$nameLine <- Qt$QLineEdit()
  nameLine$readOnly <- TRUE
  addressLabel <- Qt$QLabel("Address:")
  this$addressText <- Qt$QTextEdit()
  addressText$readOnly <- TRUE
  this$addButton <- Qt$QPushButton("&Add")
  addButton$show()
  this$submitButton <- Qt$QPushButton("&Submit")
  submitButton$hide()
  this$cancelButton <- Qt$QPushButton("&Cancel")
  cancelButton$hide()
  this$editButton <- Qt$QPushButton("&Edit")
  editButton$enabled <- FALSE
  this$removeButton <- Qt$QPushButton("&Remove")
  removeButton$enabled <- FALSE
  this$findButton <- Qt$QPushButton("&Find")
  findButton$enabled <- FALSE
  this$loadButton <- Qt$QPushButton("&Load...");
  loadButton$toolTip <- "Load contacts from a file"
  this$saveButton <- Qt$QPushButton("Sa&ve...")
  saveButton$toolTip <- "Save contacts to a file"
  saveButton$enabled <- FALSE
  qconnect(addButton, "clicked", addContact)
  qconnect(submitButton, "clicked", submitContact)
  qconnect(cancelButton, "clicked", cancel)
  qconnect(editButton, "clicked", editContact)
  qconnect(removeButton, "clicked", removeContact)
  qconnect(findButton, "clicked", findContact)
  qconnect(loadButton, "clicked", loadFromFile)
  qconnect(saveButton, "clicked", saveToFile)
  buttonLayout1 <- Qt$QVBoxLayout()
  buttonLayout1$addWidget(addButton, Qt$Qt$AlignTop)
  buttonLayout1$addWidget(editButton)
  buttonLayout1$addWidget(removeButton)
  buttonLayout1$addWidget(findButton)
  buttonLayout1$addWidget(submitButton)
  buttonLayout1$addWidget(cancelButton)
  buttonLayout1$addWidget(loadButton)
  buttonLayout1$addWidget(saveButton)
  buttonLayout1$addStretch()
  
  this$nextButton <- Qt$QPushButton("&Next")
  nextButton$enabled <- FALSE
  this$previousButton <- Qt$QPushButton("&Previous")
  previousButton$enabled <- FALSE
  qconnect(nextButton, "clicked", nextContact)
  qconnect(previousButton, "clicked", prevContact)
  buttonLayout2 <- Qt$QHBoxLayout()
  buttonLayout2$addWidget(previousButton)
  buttonLayout2$addWidget(nextButton)
  
  mainLayout <- Qt$QGridLayout()
  mainLayout$addWidget(nameLabel, 0, 0)
  mainLayout$addWidget(nameLine, 0, 1)
  mainLayout$addWidget(addressLabel, 1, 0, Qt$Qt$AlignTop)
  mainLayout$addWidget(addressText, 1, 1)
  mainLayout$addLayout(buttonLayout1, 1, 2)
  mainLayout$addLayout(buttonLayout2, 3, 1)
  
  setLayout(mainLayout)
  setWindowTitle("Simple Address Book")
  this$contacts <- character()
  this$currentMode <-
    factor("navigation", levels = c("navigation", "adding", "editing"))
  this$dialog <- FindDialog()
})
qsetMethod("addContact", AddressBook, function() {
  this$oldName <- nameLine$text
  this$oldAddress <- addressText$plainText
  nameLine$clear()
  addressText$clear()
  updateInterface("adding")
})
qsetMethod("submitContact", AddressBook, function() {
  name <- nameLine$text
  address <- addressText$plainText
  if (name == "" || address == "") {
    Qt$QMessageBox$information(this, "Empty Field",
                               "Please enter a name and address.");
    return;
  }
  if (currentMode == "adding") {
    if (is.na(contacts[name])) {
      contacts[name] <<- address
      msg <- sprintf("\"%s\" has been added to your address book.", name)
      Qt$QMessageBox$information(this, "Add Successful", msg)
    } else {
      msg <- sprintf("Sorry, \"%s\" is already in your address book.", name)
      Qt$QMessageBox$information(this, "Add Unsuccessful", msg)
      return;
    }
  } else if (currentMode == "editing") {
    if (oldName != name) {
      if (is.na(contacts[name])) {
        contacts <<- contacts[names(contacts) != oldName]
        contacts[name] <<- address
        msg <- sprintf("\"%s\" has been added to your address book.", name)
        Qt$QMessageBox$information(this, "Edit Successful", msg)
      } else {
        msg <- sprintf("Sorry, \"%s\" is already in your address book.", name)
        Qt$QMessageBox$information(this, "Edit Unsuccessful", msg)
        return;
      }
    } else if (oldAddress != address) {
      msg <- sprintf("\"%s\" has been edited in your address book.", name)
      Qt$QMessageBox$information(this, "Edit Successful", msg)
      contacts[name] <<- address
    }
  }
  updateInterface("navigation")
})
qsetMethod("cancel", AddressBook, function() {
  nameLine$text <- oldName
  addressText$plainText <- oldAddress
  updateInterface("navigation")
})
qsetMethod("nextContact", AddressBook, function() {
  i <- match(nameLine$text, names(contacts), length(contacts))
  if (i == length(contacts))
    i <- 1
  else i <- i + 1
  nameLine$text <- names(contacts)[i]
  addressText$plainText <- contacts[i]
})
qsetMethod("prevContact", AddressBook, function() {
  i <- match(nameLine$text, names(contacts))
  if (is.na(i)) {
    nameLine$clear()
    addressText$clear()
    return()
  }
    
  if (i == 1)
    i <- length(contacts)
  else i <- i - 1
  
  nameLine$text <- names(contacts)[i]
  addressText$plainText <- contacts[i]
})
qsetMethod("editContact", AddressBook, function() {
  oldName <<- nameLine$text
  oldAddress <<- addressText$plainText
  updateInterface("editing")
})
qsetMethod("removeContact", AddressBook, function() {
  name <- nameLine$text
  address <- addressText$plainText
  if (!is.na(contacts[name])) {
    msg <- sprintf("Are you sure you want to remove \"%s\"?", name)
    button <- Qt$QMessageBox$question(this, "Confirm Remove", msg,
                                      Qt$QMessageBox$Yes | Qt$QMessageBox$No)
    if (button == Qt$QMessageBox$Yes) {
      prevContact()
      contacts <<- contacts[names(contacts) != name]
      msg <- sprintf("\"%s\" has been removed from your address book.", name)
      Qt$QMessageBox$information(this, "Remove Successful", msg)
    }
  }
  updateInterface("navigation")
})
qsetMethod("findContact", AddressBook, function() {
  dialog$show()
  if (dialog$exec() == Qt$QDialog$Accepted) {
    contactName <- dialog$getFindText()
    if (!is.na(contacts[contactName])) {
      nameLine$text <- contactName
      addressText$plainText <- contacts[contactName]
    } else {
      msg <- sprintf("Sorry, \"%s\" is not in your address book.", contactName)
      Qt$QMessageBox$information(this, "Contact Not Found", msg)
      return()
    }
  }
  updateInterface("navigation")
})
qsetMethod("saveToFile", AddressBook, function() {
  fileName <-
    Qt$QFileDialog$getSaveFileName(this, "Save Address Book", "",
                                   "Address Book (*.abk);;All Files (*)")
  if (!nchar(fileName))
    return()
  else save(contacts, file = fileName)
})
qsetMethod("loadFromFile", AddressBook, function() {
  fileName <-
    Qt$QFileDialog$getOpenFileName(this, "Open Address Book", "",
                                   "Address Book (*.abk);;All Files (*)")
  if (!nchar(fileName))
    return()
  contacts <<- get(load(fileName))
  if (!length(contacts)) {
    msg <- "The file you are attempting to open contains no contacts."
    Qt$QMessageBox$information(this, "No contacts in file", msg)
  } else {
    nameLine$text <- names(contacts)[1]
    addressText$plainText <- contacts[1]
  }
  updateInterface("navigation")
})
qsetMethod("updateInterface", AddressBook, function(mode)
{
  currentMode[] <<- mode
  switch (as.character(currentMode),
          adding =,
          editing = {            
            nameLine$readOnly <- FALSE
            nameLine$setFocus()
            addressText$readOnly <- FALSE
            addButton$enabled <- FALSE
            editButton$enabled <- FALSE
            removeButton$enabled <- FALSE
            nextButton$enabled <- FALSE
            previousButton$enabled <- FALSE
            submitButton$show()
            cancelButton$show()
            loadButton$enabled <- FALSE
            saveButton$enabled <- FALSE
          },
          navigation = {
            if (!length(contacts)) {
              nameLine$clear()
              addressText$clear()
            }
            nameLine$readOnly <- TRUE
            addressText$readOnly <- TRUE
            addButton$enabled <- TRUE
            number <- length(contacts)
            editButton$enabled <- number >= 1
            removeButton$enabled <- number >= 1
            findButton$enabled <- number > 2
            nextButton$enabled <- number > 1
            previousButton$enabled <- number > 1
            submitButton$hide()
            cancelButton$hide()
            loadButton$enabled <- TRUE
            saveButton$enabled <- number >= 1
          })
}, "private")
qsetClass("FindDialog", Qt$QDialog, function(parent = NULL) {
  super(parent)
  
  findLabel <- Qt$QLabel("Enter the name of a contact:")
  this$lineEdit <- Qt$QLineEdit()
  this$findButton <- Qt$QPushButton("&Find")
  this$findText <- ""
  layout <- Qt$QHBoxLayout()
  layout$addWidget(findLabel)
  layout$addWidget(lineEdit)
  layout$addWidget(findButton)
  setLayout(layout)
  setWindowTitle("Find a Contact")
  
  qconnect(findButton, "clicked", findClicked)
  qconnect(findButton, "clicked", accept)
})
qsetMethod("findClicked", FindDialog, function() {
  text <- lineEdit$text
  if (!nchar(text)) {
    Qt$QMessageBox$information(this, "Empty Field", "Please enter a name.")
    return;
  } else {
    findText <<- text
    lineEdit$clear()
    hide()
  }
})
qsetMethod("getFindText", FindDialog, function() findText)
ab <- AddressBook()
ab$show()
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.