An R6 class is a way to create objects with methods and fields in R, allowing for object-oriented programming with encapsulation and inheritance.
Click to reveal answer
beginner
How do you create a new R6 class?
Use the <code>R6Class()</code> function, specifying the class name, public methods, and fields inside it.
Click to reveal answer
intermediate
What is the difference between public and private members in R6 classes?
Public members can be accessed from outside the object, while private members can only be accessed inside the class methods.
Click to reveal answer
beginner
How do you create an object from an R6 class?
Call the <code>$new()</code> method on the R6 class to create a new object instance.
Click to reveal answer
intermediate
Can R6 classes inherit from other R6 classes?
Yes, R6 classes support inheritance by specifying the inherit argument in R6Class().
Click to reveal answer
Which function is used to define an R6 class?
AR6Class()
Bclass()
Cnew()
DcreateClass()
✗ Incorrect
The R6Class() function is used to define R6 classes in R.
How do you access a public method named greet from an R6 object obj?
Aobj.greet()
Bobj$greet()
Cobj->greet()
Dobj[greet]
✗ Incorrect
In R6, methods and fields are accessed using the $ operator, so obj$greet() calls the method.
What does the $new() method do in R6?
AChanges class name
BDeletes an object
CLists all methods
DCreates a new object instance
✗ Incorrect
The $new() method creates a new instance of the R6 class.
Which of these is true about private members in R6 classes?
AThey can only be accessed inside class methods
BThey are accessible from outside the object
CThey are the same as public members
DThey do not exist in R6
✗ Incorrect
Private members are hidden from outside and only accessible inside the class methods.
How do you specify inheritance in an R6 class?
AInheritance is not supported
BUsing extends keyword
CUsing the inherit argument in R6Class()
DUsing super() function
✗ Incorrect
Inheritance is specified by the inherit argument inside R6Class().
Explain how to create an R6 class with a public field and a method that prints a message.
Think about how you define fields and methods inside the public list.
You got /6 concepts.
Describe the difference between public and private members in R6 classes and why encapsulation is useful.
Consider how controlling access helps protect data inside objects.
You got /5 concepts.
Practice
(1/5)
1. What is the main purpose of using R6Class() in R?
easy
A. To create plots and visualizations
B. To perform statistical tests on data
C. To import data from external files
D. To create a class that groups data and functions together
Solution
Step 1: Understand the role of R6Class()
R6Class() is used to define a class that can hold both data (fields) and functions (methods) together.
Step 2: Compare with other options
Creating plots and visualizations, performing statistical tests on data, and importing data from external files are unrelated tasks, not the purpose of R6Class().
Final Answer:
To create a class that groups data and functions together -> Option D
Quick Check:
R6Class() = class with data and methods [OK]
Hint: R6Class groups data and actions in one place [OK]
Common Mistakes:
Thinking R6Class is for data analysis only
Confusing R6Class with plotting functions
Assuming R6Class imports data
2. Which of the following is the correct way to define a method inside an R6 class?
B. methods = list(my_method = function() { print(self$field) })
C. method <- function() { print(self$field) }
D. methods = function(my_method) { print(self$field) }
Solution
Step 1: Recall R6 method syntax
Methods are defined inside a list with names as method names and values as functions, e.g., methods = list(name = function() {...}).
Step 2: Check each option
methods = list(my_method = function() { print(self$field) }) correctly uses a list with a named function. The other options do not follow the required list structure.
Hint: Methods must be in a named list inside R6Class [OK]
Common Mistakes:
Defining methods as a single function instead of list
Using assignment inside methods block incorrectly
Omitting the list() wrapper
3. What will be the output of this R code?
Person <- R6Class("Person",
public = list(
name = NULL,
initialize = function(name) {
self$name <- name
},
greet = function() {
paste0("Hello, ", self$name, "!")
}
)
)
p <- Person$new("Anna")
p$greet()
medium
A. NULL
B. Error: object 'self' not found
C. "Hello, Anna!"
D. "Hello, name!"
Solution
Step 1: Understand object creation and initialization
The class Person has a field 'name' set during initialization with self$name <- name. The object p is created with name "Anna".
Step 2: Evaluate the greet method
The greet method returns paste0("Hello, ", self$name, "!"), which becomes "Hello, Anna!" for p.
Final Answer:
"Hello, Anna!" -> Option C
Quick Check:
p$greet() = "Hello, Anna!" [OK]
Hint: self$name holds the name; greet returns greeting string [OK]
Common Mistakes:
Expecting NULL because name is NULL initially
Confusing self with private or global variables
Thinking greet prints instead of returns
4. Identify the error in this R6 class definition:
Car <- R6Class("Car",
public = list(
speed = 0,
accelerate = function() {
speed <- speed + 10
}
)
)
c <- Car$new()
c$accelerate()
c$speed
medium
A. The method should use self$speed, not speed alone
B. The class name must be lowercase
C. The accelerate method must return speed explicitly
D. The speed field cannot be initialized to 0
Solution
Step 1: Check variable usage inside method
Inside accelerate(), speed <- speed + 10 updates a local variable speed, not the field. It should be self$speed to update the object's field.
Step 2: Verify other options
Class names can be uppercase, methods don't need explicit return, and initializing speed to 0 is valid.
Final Answer:
The method should use self$speed, not speed alone -> Option A
Quick Check:
Use self$ to access fields inside methods [OK]
Hint: Use self$ to access or change fields inside methods [OK]
Common Mistakes:
Forgetting self$ prefix for fields
Assuming local variable changes affect fields
Thinking class names must be lowercase
5. You want to create an R6 class BankAccount with a field balance starting at 0 and methods deposit(amount) and withdraw(amount). The withdraw method should not allow the balance to go below zero. Which code snippet correctly implements this?