RCloud 1.3: GUI Documentation

User Guide; v1.3

Created: 2015-02-14. Updated: 2015-06-29. GUI Documentation contains an in-depth description of all the features in the RCloud GUI. RCloud documentation is currently maintained by Spencer Seidel on a voluntary basis.

Table of Contents

  1. Getting Started
  2. Graphic User Interface (GUI) Overview
  3. The Header Bar
  4. Cells
  5. Notebooks
  6. Data Access
  7. Notebook Assets
  8. notebook.R URLs
  9. Search
  10. Settings
  11. Comments
  12. Help
  13. Workspace
  14. Dataframe
  15. Session
  16. RStudio Shiny Support

1. Getting Started

RCloud supports Chrome, Chromium (the open-source version of Chrome), and Firefox web browsers, so you’ll need to download the latest version of any of these to get started.

Next, RCloud uses GitHub technology to store information about users and their RCloud notebooks. Therefore, a new user must register with their installation’s instance of GitHub. Please refer to your installation’s local documentation about creating new users.

Finally, every installation’s networking architecture will be different. Please refer to your installation’s local documentation for any relevant information.

Top

2. Graphic User Interface (GUI) Overview

Parts of the GUI

The RCloud Graphic User Interface (GUI) consists of:

Parts of the GUI

Top

GUI Navigation

Opening and Closing Panels

Clicking on the title of a panel opens and closes (and resizes in some cases) RCloud panels, such as Notebooks and Search.

Top

Opening and Closing All Panels

When all RCloud panels are minimized in a column, a “+” sign will appear, as shown here.

Window Shade Panel Left

Clicking the “+” sign will restore all panels in the column to their previous sizes. Now, a “-“ sign will appear, shown below, which will minimize all open panels in a column.

Window Shade Panel Right

Top

Changing Panel Width

To change the width of a panel, hover your mouse over the the edge that touches the cells in the middle. When it changes into a double arrow, click and drag left and right to resize.

Top

3. The Header Bar

Here is the RCloud header bar:

Header Bar

Header Bar: Share Icon: Please see the Sharing Your Notebooks section for more information.

Header Bar: Star Icon: Click the star icon to toggle the appearance of the current notebook in the My Interests area on the left sidebar. The icon displays the number of RCloud users who have added the notebook to their interests. In the case shown above, five users have done so.

Header Bar: Fork Icon: Click the fork icon to make a new copy of a notebook for editing.

Header Bar: Save Icon: Whenever you run a notebook, RCloud automatically saves a revision in GitHub. If you need to close your RCloud session immediately without waiting for a lengthy run time, click the save icon to save a revision immediately.

Header Bar: Play Icon: Click the play icon to run all markdown and prompt cells in the current notebook. Cells are executed asynchronously. RCloud displays the output as it becomes available.

Header Bar: Notebook Title: This is the title of the current notebook. In this case, “Markdown Basics.” Click the title to change it.

Note that you can create sub-directories simply by adding any number of forward slashes ‘/’, like on a Unix command line. E.g. Cookbook for R/1 - Basics/1.1 - Indexing into a Data Structure. If the sub-directories don’t already exist, RCloud will create them on the fly, so there is no need to create individual sub-directories before changing the name of your notebook. Sub-directories allow you to group your notebooks and will be displayed in a tree-like hierarchy in the Notebooks section of the left sidebar.

Also, if the notebook was created as a result of forking another notebook, the forked notebook name is displayed in a smaller font beneath the current notebook’s title.

Header Bar: Advanced Menu

Click the Advanced tab to access more features:

Header Bar: Logout: Click Logout to end your RCloud session.

Top

4. Prompt and Markdown Cells

There are two types of cells in RCloud, both used for inserting code. The first is the prompt cell, which allows you to interact with RCloud in more-or-less command-line fashion. Prompt cells are useful for quick, interactive sessions.

Prompt cells support either R or Python, which you can specify in the pull-down menu to the right of each cell:

Python Session Cell

Note that “data marshalling,” or using objects between cells of different languages, is not supported at this time.

The second type is the markdown cell. Markdown cells are better suited for cutting and pasting chunks of R code and adding simple formatted documentation. Note that markdown cells do not currently support Python.

We’ll get to the difference between Markdown and RMarkdown cells in a moment.

Top

Prompt Cells

Prompt Cell

Prompt cells mostly act like an interactive R or Python shell. Type a line of code, press Enter/Return, and the command is immediately executed. When RCloud is finished, you’re presented with the result and a new prompt cell.

For example, here’s the result of pressing Enter/Return after typing a command:

Prompt Cell Result

Note that after executing a command, RCloud presents several icons that allow you to interact with the cell: Run a Markdown Cell, Edit a Markdown Cell, Split a Markdown Cell, and Delete a Markdown Cell. Here’s a brief description of each:

Another way to interact in multi-line mode with prompt cells is to cut and paste multiple lines of code into the cell. When you do, you’ll see something like this:

Prompt Cell Result; Copy and Paste a Block of Code

To execute the code, simply put your cursor at the end of the last line and press Enter/Return.

Note that it is currently not possible to insert a prompt cell above an existing prompt cell. The only way to add new prompt cells is by executing the current prompt cell. When you do, a new cell is created under the existing one.

Top

Markdown Cells

Markdown cells are where you enter and edit blocks of multi-line R markdown. Markdown is a plain-text formatting syntax used to create simple formatted documents.

Markdown Cell

Top

Adding R Code

In order to differentiate your R code from text, surround your R code with the following (back ticks, brackets and “r”):

```{r}
## R code goes here
print("Hello World!")
```

Top

Markdown

Here’s some sample markdown, suitable for cutting and pasting into a markdown cell:


## Markdown Basics

This is plain text. Empty lines are interpreted as new paragraphs. Single newlines
are ignored by the markdown renderer.

## Code Samples

If you'd like to include code samples in your markdown, indent each line with
at least 4 spaces or a tab. Here's a hello world in R, for example.

    print ("hello, world!", quote = FALSE)
    print ("some more text")

## Emphasis

**For bold text, use two asterisks**. *For italics, use one*.

## Lists

Use an asterisk before each list item on a newline for unordered lists:

* this is a
* list

To produce an ordered list, use a number before each list item. Any number 
will do. The markdown renderer will ignore the number prefix you provide and count the list 
items itself:

1. this is an ordered
1. list

## And here's our hello world R program

```{r}
print ("hello, world!", quote = FALSE)
print ("some more text")
```

Top

Running your code

When you’re done editing in a markdown cell, click the Run Code in Markdown Cell icon to the right of the cell. Here is the result:

Run Markdown

Full documentation of markdown syntax is available here.

Top

Editing and Viewing Results

If you find a typo or would like to otherwise edit your R code, click the Edit Code in a Cell icon. You can also click on any code portions of the output to enter edit mode.

Top

Adding and Deleting Markdown Cells

To insert a markdown cell above, click the Insert Markdown Cell Above icon. To insert a markdown cell below, click the Insert Markdown Cell  Below icon. To delete a markdown cell altogether, click the Delete Markdown Cell icon.

Top

Cell Run-State Indicator

The run-state of each cell is displayed via an icon in between the gutter and cell name:

Cell Run-state: Open Circle: Cell has not been run

Cell Run-state: Blue Arrow: Cell is scheduled to be run

Cell Run-state: Running Circle: Cell is running

Cell Run-state: Green Circle: Cell has run successfully

Cell Run-state: Exclamation Point: Cell ran but had errors

Cell Run-state: Splat Circle: Cell’s run was cancelled

Top

Stopping Cell Execution

When you run a notebook, you can prevent scheduled cells from running by pressing the stop button, located in the header at the top of the screen:

Nonpreemptive Stop

Note that this will not interrupt currently running cells. (Running Circle). It will only prevent scheduled cells from running.

Top

Rearranging Cells

To rearrange your cells, click and drag the blank status area above the cell or the Insert Cell icon to the left of the cell.

Top

Joining Cells

To join cells of the same flavor, click the join icon at the right of the cell. This will combine the contents of the cell with the cell immediately above it.

Joining Cells

Markdown versus RMarkdown Cells

Behind the scenes, RCloud uses several different R packages to render output. Markdown cells use the Markdown Cell and knitr packages directly for output. RMarkdown cells, on the other hand, use rmarkdown (a.k.a. R Markdown v2).

Currently RMarkdown support should be considered experimental.

Top

5. Notebooks

RCloud notebooks are simply collections of prompt and markdown cells, comments, and assets, which we’ll get to later. Everything in your public notebooks is searchable by every other user of the system. This encourages reuse and makes learning how to use the hundreds of available R packages easier.

You can also browse everyone else’s notebooks by opening the Notebooks section on the left sidebar. To do this, simply click on Notebooks at the top of the panel. This toggles the panel, opening or closing it:

Directory of User Notebooks

To load a notebook into the current session, click on the name. After it loads, you can examine the source code or click “Run” in the header bar to execute all the cells on the page.

Top

Creating a Notebook

To create a new, blank notebook, click the + sign at the right of the Notebooks panel header area:

Create a New Notebook

RCloud will automatically choose a title for your new notebook, Notebook N, where N is the next available number among your notebooks. To give your notebook a more meaningful title, click on the title in the header bar.

Top

Running a Notebook

To run all the cells in your notebook, click the Header Bar: Play Icon icon in the header bar.

RCloud notebooks are executed asynchronously. RCloud will show individual cell results as the results are ready to display.

Top

Long-Running Notebooks

Notebooks that run longer than a few seconds will cause the browser screen to dim and a please-wait message to be displayed.

Currently, RCloud has no explicit mechanism to stop a long-running notebook. If you mistakenly launch a long-running notebook, you can simply reload the notebook in another browser tab or reload the page. This doesn’t stop the execution behind the scenes, but the output of the previous run will not interrupt your current session. Be careful of side-effects, like changing the contents of a file in your local directory in such a way that it affects the output of the notebook.

Top

Forking (Copying) a Notebook

To copy another user’s notebook, first navigate to it in the left sidebar and then click to load it into your current session. Now, you’re running another user’s public notebook in your own session. This is sufficient for running reports or performing other read-only activities. If you want to edit the notebook, you’ll need to make your own copy, or, “fork” it.

After you’ve loaded the notebook you want to fork, click the Fork icon in the header bar at the top of the screen:

Header Bar: Fork Icon

After forking a notebook, you’ll own your own copy and therefore be able to edit it.

The fork icon is always available, which means you can fork your own notebooks. If you are viewing a previous version of a notebook, you can fork a copy of that version. Caution: currently when you fork your own notebook, the history is lost; we hope to fix this soon.

Top

Saving Your Work

There are two mechanisms by which your work is saved in RCloud.

Top

Manual Saving

You can save your notebook at any time by clicking the Header Bar: Save Icon icon in the header bar.

Top

Versioning

RCloud keeps track of your notebook versions automatically and frequently. Every time you save, create, or run a markdown or prompt cell, the newest version of your notebook is saved. To browse the versions of your notebook, which are stored chronologically with the latest version on top, hover over the name of your notebook in the left sidebar and click the clock icon:

History or Versioning Icon

To change they way dates and times are displayed next to your notebook versions, see the show terse version dates setting.

Top

Version Tagging

To “tag” a notebook version, click twice on a version name to edit it in place.

Version Tagging

Now, rather than referring to a specific notebook version with &version=hash in a URL, you can refer to a specific notebook tag:

Version Tagging URL

&tag=name

This is useful when you want to share a version of a notebook but plan to continue developing it. For example, you can tag a version as the “LatestProductionVersion,” and then apply that tag to another version when you’re ready to share your new work. This way, existing URLs (perhaps stored in someone’s bookmarks) won’t break as you update your notebooks.

Top

Reverting to a Previous Version

Should you decide that a previous version of your notebook is the “best” version, you can make that version the current version by loading the desired previous version of the notebook and clicking the revert icon.

Revert Version

Top

Public and Private Notebooks

By default, all RCloud notebooks are public and therefore visible to all RCloud users. If you’d like to toggle the public/private flag on a notebook, hover over the name of your notebook on the left sidebar and click the eye icon. Note that private notebook titles are grayed out for owners and invisible to other users.

Top

Toggle Private

Clicking the Private Notebook Toggle Icon icon will make your notebook private.

Top

Toggle Public

Clicking the Public Notebook Toggle Icon icon will make your notebook public.

Top

Deleting Notebooks

To delete a notebook, hover over the name of your notebook in the left sidebar and click the Delete Notebook Icon icon.

RCloud will ask for a confirmation:

Confirm Notebook Deletion

Click OK and the notebook will disappear from the left sidebar and the last-viewed available notebook will automatically load into the current session.

Top

Sharing Your Notebooks

There are several ways you can share your notebooks with colleagues. When you click on the downward arrow next to the share icon in the header bar Header Bar: Share Icon, a popup menu will appear:

Header Bar: Share Icon Type

This allows you to select the kind of URL you’d like to share. Make your selection using the popup menu and then right click on the Header Bar: Share Icon icon to copy the hyperlink.

Note that if you have a tagged version of your notebook currently loaded, where appropriate, RCloud will populate the shared URL with the tag instead of the version. This is beneficial because then you can tag future versions with the same tag and not break existing URLs.

Top

view.html

This is the simplest method. This will create a link that will allow someone to see the notebook code and execute the notebook within the RCloud IDE. Users who do not own the notebook will see the play Header Bar: Play Icon and edit Heder Bar: Share Icon icons in the header. Clicking the play icon will execute all cells in the notebook. Clicking the edit icon will return to the normal header (if user is logged in), allowing a registered user to fork the notebook; once the notebook is forked (or in other words copied into the registered user’s personal directory), then the registered user may edit and share the notebook.

Top

notebook.R

This option is intended for FastRweb notebooks. Loading the URL (from anywhere, including other notebooks, a perl script, etc.) executes a notebook “behind the scenes” by opening a one-time R session, running the defined “function” within, shutting down the R session, and finally, returning the result. FastRweb notebooks MUST have a function named function() defined, as this what notebook.R tries to execute upon instantiation. Output from notebook.R can be anything. Text, binary data, whatever, as this information will ultimately be processed by whatever mechanism that called notebook.R.

notebook.R allows trailing paths to be processed by the notebook code if they start with /.self/. The subsequent path portion is passed to the run function as the .path.info argument. This allows notebooks to handle a “full tree” argument to the notebook on top of a single notebook URL.

E.g.: https://rcloud.mydomain.com/notebook.R/user/notebook/.self/foo/bar will call the notebook with .path.info set to /foo/bar. Note that the .self part distinguishes asset look up from a path info call.

See the notebook.R URLs section of the documentation for more detailed information about notebook.R URLs.

Top

mini.html

Unlike notebook.R, mini.html URLs open an R session via a Websocket and keep it open. Mini.html notebooks MUST have a function named rcw.result() defined, as that is what mini.html tries to execute upon instantiation. Because the R session is kept open, users or processes can interact with the R session while the websocket is kept open.

Top

shiny.html

RCloud supports the RStudio Shiny web application framework. To share Shiny-enabled notebooks, select this option.

Top

Who Starred my Notebook?

To find out which users starred your notebook, click the notebook information icon:

Saving Plots

Top

Saving Plots

Hover the mouse over a plot created in an R cell to make the disk icon appear in the upper right corner (see 1), which contains a list of available image formats. A widget at the lower-right corner can be used to resize the image (see 2).

Resizing Plots

Note that you can only save plots created in R cells.

Top

Find and Find Replace

To find text within your notebook, type Ctrl-F (Win/Linux) or Cmd-F (Mac) to open a find dialog at the top of your notebook:

Find Text

To find and replace text within your notebook, type Ctrl-H (Win/Linux) or Cmd-Option-F (Mac) to open a find and replace dialog at the top of your notebook:

Find and Replace Text

Top

6. Data Access

Top

File Upload

There many ways to use your own data in RCloud. Please see the example notebooks under RCloud Sample Notebooks for some examples. Here, we’ll take a closer look at the simplest method: uploading a flat file. Open the File Upload panel on the right sidebar by clicking on the heading. Then, select “Choose File” and browse to a local file, in this case “distrib.csv.”

File Upload: Example 1

Next, click the “Upload” button. If the file exists (just where, we’ll get to in a moment), RCloud prompts with a notice that it will be overwritten. If all goes well, RCloud confirms the upload.

The file now exists in your installation server’s home directory and is accessible from within RCloud. For example:

File Upload: Example 2

The first line of R code loads the contents of the CSV file into an object called “mydata.” The next line tells R to output a string version of the object.

Top

Upload to Notebook

The Upload to Notebook checkbox changes the way File Upload works. Rather than uploading your file to your home directory, RCloud will store the file inside your notebook as an “asset.” To view notebook assets, click on the assets bar on the right sidebar. Please see the Notebook Assets section for more information.

Top

7. Notebook Assets

Notebooks can contain “assets,” which are files that can be used within your notebooks or simply for keeping track of unused code (as in the the case of scratch.R, which is a text file where you can keep bits of code while working on your notebook).

Asset Panel

Top

Data as an Asset

For example, from the previous example, lets create an asset called distrib.csv that contains the following data:

a,1
b,15
c,4

We can store this data in a new asset called “distrib.csv,” simply by clicking New Asset and typing distrib.csv as a name.

Now, this data is accessible in your R code:

CSV Asset

Top

Uploading Assets

In addition to manually entering asset text, you can also drag and drop files into the Assets panel to upload them:

Drag and Drop

Top

Cascading Style Sheets; Using CSS

Assets can contain Cascading Style Sheet (CSS) formatting information. This changes the way information is presented when your notebook is executed. For example, here is a bit of CSS that defines a paragraph style:

p.mystyle {
  font-size: 20px;
  color: red;
}

To use this CSS as an asset, it needs to have a special name that begins with “rcloud-“ and ends with “.css”. In the example below, the name is “rcloud-mystyle.css”.

RCloud automatically uses CSS asset files with this file pattern and ignores others, so you can save bits of CSS in other files without worrying about overlap.

To use the p.mystyle paragraph style, simply reference it in markdown using HTML:

# My Header

Here is a bit of red text:

<p class="mystyle">This is red.</p>

Using (or Adding) CSS

Note that you must reload your notebook to apply the CSS.

Top

JavaScript

Assets can also contain JavaScript. When editing JavaScript (files must have the .js extension), RCloud automatically uses a JavaScript editing mode, which has built-in syntax checking.

Javascript Files

Top

Renaming Assets

To rename an asset, simply click on the file name on the asset’s tab.

Javascript Asset

Top

8. notebook.R URLs

It’s possible to construct a URL for a notebook asset by selecting Open in GitHub in the Advanced menu, locating your asset and right-clicking the “View Raw” icon, which looks like <> next to your asset. The URLs look like this:

https://github.mydomain.com/gist/rclouddocs/d2b9231aca224bbbb888/raw/efb98239f9acc030f98b2cd1957ce7c9b4b9f2c3/DummyData.csv

This is unwieldy. A better and more powerful way to access assets is via the HTTP entry point, notebook.R.

Notebook.R allows you to access your notebook in the following ways:

http://rcloud.mydomain.com/notebook.R/<notebook-id>
http://rcloud.mydomain.com/notebook.R/<notebook-id>/<version-hash>
http://rcloud.mydomain.com/notebook.R/<notebook-id>/<filename>
http://rcloud.mydomain.com/notebook.R/<notebook-id>/<version-hash>/<filename>
http://rcloud.mydomain.com/notebook.R/<user>/<notebook-name>
http://rcloud.mydomain.com/notebook.R/<user>/<notebook-name>/<filename>

URLs ending in “<filename>” will return the given asset (file). To illustrate how it works using the previous example, any of these give HTTP access to the latest version of DummyData.csv:

http://rcloud.mydomain.com/notebook.R/d2b9231aca224bbbb888/DummyData.csv
http://rcloud.mydomain.com/notebook.R/rclouddocs/Asset%20API/DummyData.csv

Access to assets isn’t the only thing you can do with notebook.R. Notice that in the list of ways to access your notebook above, not all methods reference a filename. If you reference a notebook or revision of a notebook, the URL will return the result of the evaluated notebook.

notebook.R is intended to be a general-purpose Remote Procedure Call (RPC) in R. RPCs in RCloud should always contain some markdown to document what the RPC does, what the arguments are, etc. This way other users can simply view your notebook in RCloud to understand how to use it. This isn’t enforced in any way but is encouraged to promote reuse. The markdown is only visible when users visit your notebook in RCloud. The markdown is not output when called remotely.

Please see the following for more notebook.R features and information.

Top

To conduct a global text search in all public RCloud notebooks, simply open up the search panel by clicking on Search on the left sidebar. Here are the results for a search on “markdown.” RCloud searches code, comments, notebook names, assets, everything.

Search Results

1

Results can be sorted by the number of stars a notebook has, the author of the notebook (User), the notebook’s name, or by the date a notebook was created.

2

Sorts the results in descending (Desc) or ascending (Asc) order.

3

When too many results are returned for any one notebook, RCloud will display a Show me more link that, when clicked, will toggle the rest of the results.

4

Search results are paginated. Click on any page number below the results or use the Back Page back or Forward Page next page to page through the results.

Top

Complex Searches

RCloud supports Lucene’s feature-rich query parser syntax for more complex searches. Features include wildcard, fuzzy, and proximity searches, boolean operators, grouping, and much more.

Please see the Official query parser syntax documentation for more information.

Top

10. Settings

Various aspects of your RCloud session can be changed here.

Notebook Settings

Top

Show Command Prompt

This setting toggles the appearance of the default prompt cell that appears at the bottom of the currently loaded notebook.

Top

Show Terse Version Dates

This controls how RCloud displays dates when viewing notebook versions. When selected, RCloud will display dates and times only when they’re different from the version before it.

Subscribe to Comments

When checked, RCloud will send an email whenever someone leaves a comment about your notebook.

Top

Extensions

Power users can extend RCloud’s user interface with global and per-user extensions. Although this functionality is outside the scope of this document, more information is available here.

You can enable and disable extensions using the “Enable Extensions” and “Disable Extensions” text boxes. These set the user options addons and skip-addons, respectively. On starting the session, any extensions listed in skip-addons are not loaded.

Enter a list of extensions, comma delimited, and press enter. You will then have to reload the page.

Per User Settings

Top

11. Comments

Anyone can leave comments about anyone’s notebooks in the Comments panel in the right sidebar, as demonstrated below:

Notebook Comments

Comments are included in search results.

To submit a comment, simply input your text in the text area and click the comment icon Notebook Comment Icon. You can also submit your comment by pressing Ctrl-Enter (Win/Linux) or Cmd-Enter (Mac).

Top

Editing Comments

To edit a comment, click on the comment text to make changes. Then click Ctrl- or Cmd-Enter to update the comment.

Edit Comments

Top

Deleting Comments

To delete a comment, hover your mouse over the comment. Click the X next to the comment to delete it.

Delete Comments

Top

12. Help

It’s often difficult to remember arguments to functions and what they mean, so RCloud has an inline help feature. In a new prompt cell, type a question mark immediately followed by an R function name and then press Enter/Return to execute the cell:

?print

If help is available, RCloud will open the Help panel:

Help Panel

Alternatively, you can enter a function name in the text box at the top of the panel and click the help icon Help Button.

Top

13. Workspace

In the course of working with your notebook, variables are defined and assigned. Often, it is convenient to know the value of a variable without issuing a command to display it. The Workspace panel displays every variable you’ve defined along with its value.

Workspace Panel

In the case of dataframe variables, a link is displayed, which, when clicked, will open up the Dataframe panel.

Top

14. Dataframe

Dataframe Panel

Dataframe objects are displayed here after you click a dataframe link in the Workspace panel or use the View(object) command in a cell:

View(a[1:10,])

Top

15. Session

The session panel displays critical system information when available, such as session timeouts. The panel will automatically open when messages are available.

Session Panel

Click the Dismiss Session Notifications icon to dismiss a session notification.

Top

16. RStudio Shiny Support

RCloud contains preliminary support for the RStudio Shiny web application framework via the rcloud.shiny package. rcloud.shiny emulates a network connection to run Shiny on an RCloud server and client instead of a Shiny server. Basic functionality is supported. Shiny extensions are not yet supported.

Although comprehensive documentation of rcloud.shiny is beyond the scope of this document, the implementation is simple enough to get many users already familiar with Shiny started.


# Include rcloud.shiny library
library(rcloud.shiny)
# Include all the libraries from ui.R and server.R
library(datasets)

# The rcloud.shinyApp function is the equivalent of the shinyApp
# (http://rmarkdown.rstudio.com/authoring_embedded_shiny.html#inline-applications)
# function in shiny library.
rcloud.shinyApp(
  
  # Pass the ui.R code something as shown below. 
  ui = fluidPage(

    # Application title
    headerPanel("Word Cloud"),
    .
    .
    .
    etc.

To learn more about how to use Shiny in RCloud, please see the rcloud.shiny example notebooks under RCloud Sample Notebooks in the Notebooks panel and the official Shiny documentation.

Top