Bird
Raised Fist0
R Programmingprogramming~20 mins

S3 object system in R Programming - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
S3 Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this S3 method call?
Consider the following R code using S3 classes and methods. What will be printed when print(obj) is called?
R Programming
obj <- structure(list(name = "Alice", age = 30), class = "person")
print.person <- function(x) {
  cat("Person:", x$name, "is", x$age, "years old\n")
}
print(obj)
APerson: Alice is 30 years old
B[1] "Person: Alice is 30 years old"
Clist(name = "Alice", age = 30)
DError in print.person(obj) : could not find function "print.person"
Attempts:
2 left
💡 Hint
Remember that S3 methods are functions named like generic.class and are called automatically by the generic.
🧠 Conceptual
intermediate
1:30remaining
How does S3 method dispatch work in R?
Which statement best describes how R finds the correct S3 method to call when a generic function is used?
AR always calls the generic function without checking the object's class.
BR uses formal class definitions and inheritance trees to find the method in a class hierarchy.
CR looks for a function named <code>generic.class</code> where <code>class</code> is the class of the object, and calls it if found.
DR requires the user to manually call the method function for each class.
Attempts:
2 left
💡 Hint
Think about the naming pattern of S3 methods.
🔧 Debug
advanced
2:30remaining
Why does this S3 method not get called?
Given the code below, why does summary(obj) not call summary.myclass as expected?
R Programming
obj <- structure(list(x = 1:5), class = "myclass")
summary.myclass <- function(object) {
  # Custom summary
}
summary(obj)
AThe class attribute is not set correctly on <code>obj</code>.
BThe method <code>summary.myclass</code> does not return a value explicitly, so it returns NULL and appears not to work.
CThe generic <code>summary</code> does not support S3 dispatch.
DThe method name should be <code>summary_myclass</code> with underscore.
Attempts:
2 left
💡 Hint
Check what the method function returns.
📝 Syntax
advanced
2:00remaining
Which option correctly defines an S3 method for class 'data.frame' for the generic 'head'?
Choose the correct syntax to define an S3 method head.data.frame that returns the first 3 rows of a dataframe.
A
head.data.frame &lt;- function(x) {
  x[1:3, ]
}
B
head.data.frame &lt;- function(x, n) {
  x[1:n]
}
C
head.data.frame &lt;- function(x) {
  return(x[1:3])
}
D
head.data.frame &lt;- function(x, n = 3) {
  x[1:n, ]
}
Attempts:
2 left
💡 Hint
The original head generic accepts an argument n with default 6.
🚀 Application
expert
2:30remaining
How many items are in the list returned by this S3 generic with multiple classes?
Consider this R code where an object has multiple classes and a generic returns a list. How many elements does the list returned by foo(obj) contain?
R Programming
foo <- function(x) UseMethod("foo")
foo.class1 <- function(x) list(a = 1, b = 2)
foo.class2 <- function(x) list(c = 3)
obj <- structure(list(), class = c("class1", "class2"))
result <- foo(obj)
length(result)
A2
B3
C1
D0
Attempts:
2 left
💡 Hint
S3 dispatch calls the method for the first class in the class vector.

Practice

(1/5)
1. What is the main purpose of the S3 object system in R?
easy
A. To speed up the execution of R code
B. To provide a graphical user interface for R
C. To allow functions to behave differently based on the class of their input
D. To manage memory allocation automatically

Solution

  1. Step 1: Understand S3 system role

    S3 is designed to let functions act differently depending on the class of the object they receive.
  2. Step 2: Compare options

    Only To allow functions to behave differently based on the class of their input describes this behavior. Other options describe unrelated features.
  3. Final Answer:

    To allow functions to behave differently based on the class of their input -> Option C
  4. Quick Check:

    S3 purpose = different behavior by class [OK]
Hint: Remember: S3 dispatches methods by object class [OK]
Common Mistakes:
  • Confusing S3 with speed optimization
  • Thinking S3 manages memory
  • Assuming S3 provides a GUI
2. Which of the following is the correct way to define an S3 method for the generic function print for objects of class myclass?
easy
A. print_myclass <- function(x) { cat("My class object") }
B. print.myclass <- function(x) { cat("My class object") }
C. print(myclass) <- function(x) { cat("My class object") }
D. function print.myclass(x) { cat("My class object") }

Solution

  1. Step 1: Recall S3 method naming convention

    S3 methods are named as generic.class, here print.myclass.
  2. Step 2: Check syntax correctness

    print.myclass <- function(x) { cat("My class object") } uses correct assignment and function syntax. Others have invalid syntax or wrong naming.
  3. Final Answer:

    print.myclass <- function(x) { cat("My class object") } -> Option B
  4. Quick Check:

    S3 method = generic.class naming [OK]
Hint: Use generic.class naming to define S3 methods [OK]
Common Mistakes:
  • Using underscores instead of dots in method names
  • Incorrect function assignment syntax
  • Trying to assign function to generic(class)
3. What will be the output of the following R code?
obj <- structure(list(a = 1), class = "myclass")
print.myclass <- function(x) { cat("Class is myclass\n") }
print(obj)
medium
A. Class is myclass
B. [1] 1
C. Error: could not find function "print.myclass"
D. NULL

Solution

  1. Step 1: Understand object class and method

    The object has class "myclass" and a print.myclass method is defined.
  2. Step 2: Method dispatch on print()

    Calling print(obj) triggers print.myclass, which prints "Class is myclass" with a newline.
  3. Final Answer:

    Class is myclass -> Option A
  4. Quick Check:

    print dispatches to print.myclass [OK]
Hint: print calls method matching object's class [OK]
Common Mistakes:
  • Expecting default print output
  • Thinking print.myclass is not found
  • Ignoring class attribute
4. Consider this code snippet:
obj <- list(a = 10)
class(obj) <- "myclass"
print.myclass <- function(x) { cat("Value:", x$a, "\n") }
print(obj)

What is the error in this code if any?
medium
A. Error because print() does not dispatch to print.myclass
B. Error because print.myclass is not defined correctly
C. Error because class assignment is invalid
D. No error; it prints 'Value: 10'

Solution

  1. Step 1: Check class assignment

    Assigning class "myclass" to obj is valid.
  2. Step 2: Check method definition and dispatch

    print.myclass is correctly defined and print(obj) calls it, printing "Value: 10".
  3. Final Answer:

    No error; it prints 'Value: 10' -> Option D
  4. Quick Check:

    Class and method correctly set, print dispatches [OK]
Hint: Assign class before calling generic function [OK]
Common Mistakes:
  • Defining method after calling print
  • Not assigning class attribute
  • Misnaming method function
5. You want to create an S3 generic function describe that behaves differently for numeric and character vectors. Which of the following code snippets correctly sets up the generic and methods?
hard
A. describe <- function(x) UseMethod("describe") describe.numeric <- function(x) { paste("Numeric with length", length(x)) } describe.character <- function(x) { paste("Character with length", length(x)) }
B. describe <- function(x) { if (is.numeric(x)) "numeric" else "character" } describe.numeric <- function(x) {} describe.character <- function(x) {}
C. describe.numeric <- function(x) { paste("Numeric", length(x)) } describe.character <- function(x) { paste("Character", length(x)) }
D. describe <- function(x) { UseMethod(describe) } describe.numeric <- function(x) { length(x) } describe.character <- function(x) { length(x) }

Solution

  1. Step 1: Define generic function correctly

    The generic must call UseMethod with the generic name as a string: UseMethod("describe").
  2. Step 2: Define methods with correct naming and behavior

    Methods describe.numeric and describe.character are correctly named and return descriptive strings.
  3. Final Answer:

    describe <- function(x) UseMethod("describe") describe.numeric <- function(x) { paste("Numeric with length", length(x)) } describe.character <- function(x) { paste("Character with length", length(x)) } -> Option A
  4. Quick Check:

    Generic + methods correctly defined [OK]
Hint: Generic calls UseMethod with string name [OK]
Common Mistakes:
  • Calling UseMethod without quotes
  • Not defining generic before methods
  • Empty method bodies
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard