fireData provides an R interface to common operations in selected Google Firebase services, enabling you to: - Store and retrieve data from Firebase Realtime Database - Store and query documents in Cloud Firestore - Authenticate users with email/password, Google OAuth, or anonymous login - Upload and download files from Cloud Storage
The package focuses on common REST operations for these four services. It does not cover every Firebase product or every advanced endpoint; see Firebase feature support.
From the Firebase Console, you’ll need:
There are several ways to configure fireData:
Option A: Environment Variables (Recommended for production)
Sys.setenv(FIREBASE_PROJECT_ID = "your-project-id")
Sys.setenv(FIREBASE_API_KEY = "your-api-key")
Sys.setenv(FIREBASE_DATABASE_URL = "https://your-database-url")
Sys.setenv(FIREBASE_STORAGE_BUCKET = "your-project-id.firebasestorage.app")Option B: Configuration File
Configuration files use the following format:
default:
project_id: your-project-id
api_key: your-api-key
database_url: https://your-database-url
storage_bucket: your-project-id.firebasestorage.appOption C: Interactive Wizard
The wizard configures the current session by default. Saving requires
save = TRUE and an explicit file path; the parent directory
must exist.
library(fireData)
# Create connection (uses config from environment/file)
conn <- firebase_connect()
# Or with explicit values
conn <- firebase_connect(
project_id = "my-project",
api_key = "AIzaSy...",
database_url = "https://your-database-url",
storage_bucket = "my-project.firebasestorage.app"
)
print(conn)The Realtime Database stores data as one large JSON tree. It’s great for simple data structures and real-time sync.
# Push data with auto-generated key
path <- rtdb_push(conn, "messages", list(
text = "Hello from R!",
author = "R User",
timestamp = as.character(Sys.time())
))
print(path)
# "messages/-NxYz123..."
# Set data at specific path (overwrites)
rtdb_set(conn, "users/user123", list(
name = "John Doe",
email = "john@example.com"
))
# Update specific fields (merge)
rtdb_update(conn, "users/user123", list(
lastLogin = as.character(Sys.time())
))Cloud Firestore is a flexible, scalable NoSQL database. Unlike the Realtime Database, Firestore stores data in documents organized into collections, making it better for complex, structured data.
| Feature | Realtime Database | Cloud Firestore |
|---|---|---|
| Data model | Large JSON tree | Documents in collections |
| Queries | Limited filtering | Rich queries with multiple filters |
| Scaling | Limited | Automatic, global |
| Offline support | Basic | Advanced |
| Best for | Simple data, real-time sync | Complex data, advanced queries |
# Authenticate first (Firestore requires auth)
result <- auth_sign_in(conn, "user@example.com", "password")
conn <- firebase_set_token(conn, result)
# Create/overwrite a document
firestore_set(conn, "users", "user123", list(
name = "John Doe",
email = "john@example.com",
age = 30,
active = TRUE
))
# Add document with auto-generated ID
result <- firestore_add(conn, "messages", list(
text = "Hello Firestore!",
timestamp = Sys.time()
))
print(result$.id) # Auto-generated document ID
# Get a document
user <- firestore_get(conn, "users", "user123")
print(user$name)
# Update specific fields (without overwriting entire document)
firestore_update(conn, "users", "user123", list(
lastLogin = Sys.time(),
loginCount = 42
))
# Delete a document
firestore_delete(conn, "users", "user123")# List all documents in a collection
result <- firestore_list(conn, "users", page_size = 50)
for (user in result$documents) {
print(paste(user$name, "-", user$email))
}
# Paginate through large collections
result <- firestore_list(conn, "users", page_size = 10)
while (!is.null(result$nextPageToken)) {
# Process result$documents
result <- firestore_list(conn, "users", page_size = 10,
page_token = result$nextPageToken)
}Firestore supports powerful queries with multiple filters:
# Query with filters
results <- firestore_query(conn, "products") |>
fs_where("price", "<", 100) |>
fs_where("inStock", "==", TRUE) |>
fs_order_by("price", "asc") |>
fs_limit(20) |>
fs_execute()
for (product in results) {
print(paste(product$name, "- $", product$price))
}
# Available filter operators:
# "==" (equal), "!=" (not equal)
# "<", "<=", ">", ">=" (comparisons)
# "array-contains", "array-contains-any"
# "in", "not-in"
# Select specific fields only
results <- firestore_query(conn, "users") |>
fs_select("name", "email") |>
fs_limit(100) |>
fs_execute()Firestore supports nested data with subcollections:
# Upload file
result <- storage_upload(conn,
file_path = "local/image.jpg",
object_name = "images/photo.jpg"
)
print(result$url)
# Download file
dest_file <- tempfile(fileext = ".jpg")
storage_download(conn, "images/photo.jpg", dest_file)
unlink(dest_file)
# List files
files <- storage_list(conn, prefix = "images/")
# Get download URL
url <- storage_get_url(conn, "images/photo.jpg")fireData seamlessly handles R data frames:
fireData provides informative error messages:
?fireData for a complete function
reference