0Pricing
R Academy · 课时

赋值与特殊运算符

探索 R 中的 >、%in% 和管道运算符

赋值与特殊运算符 是 CoddyKit 上的免费 R Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。

R 中的赋值

R 提供了多种为变量赋值的方式。最符合 R 习惯的写法是 <-,也是推荐的风格。您还会遇到用于赋值的 =,但它在某些上下文中的行为略有不同。

# Both assign a value, <- is preferred
name <- 'Alice'
age = 30
cat('Name:', name, '
')
cat('Age:', age, '
')

左箭头 <- 与等号 =

<- 始终会在当前环境中创建一个变量。= 也可以进行赋值,但在函数调用中,它设置的是命名参数,而不是创建变量。这一区别很重要。

# <- creates a variable outside function calls
x <- 42

# = inside function call sets argument, does NOT create x
mean(x = c(1, 2, 3))  # x is an arg here, not a variable

# But <- inside a function call DOES create a variable
mean(y <- c(1, 2, 3))  # y is now also in workspace
cat('y was created:', y, '
')

右赋值运算符 ->

R 也支持从右向左赋值,使用 ->。它会将左侧的值赋给右侧的名称。虽然这种写法有效,但实际中很少使用,因为它会降低可读性。

# Right assignment operator
100 -> max_score
'R Programming' -> course_name
cat('Max score:', max_score, '
')
cat('Course:', course_name, '
')

# Same as:
# max_score <- 100
# course_name <- 'R Programming'

使用 <<- 进行全局赋值

<<- 会将值赋给父环境(封闭环境)中的变量,而不是局部函数环境中的变量。它用于在函数内部修改函数外部已有的变量。

counter <- 0

increment <- function() {
  counter <<- counter + 1  # modifies the global counter
}

increment()
increment()
increment()
cat('Counter after 3 increments:', counter, '
')

%in% 成员运算符

%in% 会测试左侧的每个元素是否出现在右侧的向量中。它会返回一个逻辑向量,其长度与左侧操作数相同。在 R 中,这是测试集合成员关系最简洁的方式。

fruits <- c('apple', 'banana', 'cherry', 'date', 'elderberry')

# Check membership
cat('Is mango in fruits?', 'mango' %in% fruits, '
')
cat('Is cherry in fruits?', 'cherry' %in% fruits, '
')

# Check multiple values at once
search <- c('banana', 'mango', 'date')
cat('Which are in fruits:', search %in% fruits, '
')

使用 %in% 进行筛选

%in% 在筛选向量或数据框行时尤其强大。它可以让您选择属于预定义允许值集合的元素。

countries <- c('USA', 'UK', 'Canada', 'Germany', 'France', 'Japan')
populations <- c(331, 67, 38, 83, 67, 126)  # millions

# Keep only G7 European members
g7_europe <- c('UK', 'Germany', 'France', 'Italy')
mask <- countries %in% g7_europe
cat('G7 Europe countries:', countries[mask], '
')
cat('Populations:', populations[mask], '
')

使用 %*% 进行矩阵乘法

%*% 执行真正的矩阵乘法* 执行的是逐元素相乘。对于两个矩阵 A(m x n)和 B(n x p),结果是一个(m x p)矩阵。

A <- matrix(c(1, 2, 3, 4), nrow = 2, ncol = 2)
B <- matrix(c(5, 6, 7, 8), nrow = 2, ncol = 2)

cat('Matrix A:
')
print(A)
cat('Matrix B:
')
print(B)
cat('A %*% B (matrix mult):
')
print(A %*% B)
cat('A * B (element-wise):
')
print(A * B)

原生管道 |&gt;

R 4.1 引入的原生管道 |> 会将左侧表达式的结果作为右侧函数的第一个参数传入。它能让一连串操作的可读性大幅提升。

# Without pipe
result1 <- round(sqrt(abs(-16)), 2)
cat('Without pipe:', result1, '
')

# With native pipe |>
result2 <- -16 |> abs() |> sqrt() |> round(2)
cat('With pipe:', result2, '
')

# Reading left to right: take -16, get abs, sqrt, then round

对向量使用管道

原生管道 |> 对向量和数值运算尤其有用。您可以串联多个变换,而不必创建中间变量,使代码更简洁、更易于理解。

scores <- c(88, 45, 92, 61, 73, 55, 84, 79)

# Chain: keep passing scores, then compute mean
passing_mean <- scores |> \(x) x[x >= 60] |> mean()
cat('Mean of passing scores:', round(passing_mean, 2), '
')

# Another chain: sort, reverse, take top 3
top3 <- scores |> sort(decreasing = TRUE) |> head(3)
cat('Top 3 scores:', top3, '
')

自定义中缀运算符

R 允许您使用 %name% 语法定义自定义中缀运算符。dplyr 等程序包就是这样定义 %>% 管道的。您可以为特定领域的操作创建自己的运算符。

# Define a custom infix operator for 'not in'
'%notin%' <- function(x, table) !(x %in% table)

cities <- c('Paris', 'London', 'Berlin', 'Tokyo', 'Sydney')
exclude <- c('Tokyo', 'Sydney')

cat('Cities not in exclude list:', cities[cities %notin% exclude], '
')

运算符速查

以下是本课介绍的特殊运算符摘要:

  • <- — 标准赋值(推荐)
  • = — 赋值(也用于函数参数)
  • <<- — 全局/父环境赋值
  • %in% — 成员关系测试
  • %*% — 矩阵乘法
  • |> — 原生管道(R 4.1+)
  • %name% — 自定义中缀运算符语法
# Demonstrate %in% as a filter
all_nums <- 1:20
special <- c(3, 6, 9, 12, 15, 18)
cat('Multiples of 3 up to 20:', all_nums[all_nums %in% special], '
')

# Demonstrate pipe
1:10 |> mean() |> cat('
')

快速检查

将 %in% 运算符用于 c(2, 4, 6) %in% c(1, 2, 3) 时,它会返回什么?

回顾:特殊运算符

做得很好!以下是本课的要点:

  • 使用 <- 进行赋值,这是 R 的惯用写法
  • = 可以用于赋值,但在函数调用中容易产生歧义
  • <<- 可以在函数内部修改父环境(全局环境)中的变量
  • %in% 是在 R 中测试集合成员关系最简洁的方式
  • %*% 执行矩阵乘法(而不是逐元素相乘)
  • 原生管道 |>(R 4.1+)可以从左到右串联函数调用,让代码更易读
  • 自定义运算符遵循 %name% 模式
# Pipe + %in% combined
data <- c(5, 12, 3, 8, 15, 7, 20, 1)
valid_range <- 5:15

result <- data |> \(x) x[x %in% valid_range] |> sort()
cat('Values in range 5-15:', result, '
')

常见问题解答

「赋值与特殊运算符」课时是免费的吗?

是的 — 「赋值与特殊运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「赋值与特殊运算符」这节课中我会学到什么?

探索 R 中的 >、%in% 和管道运算符 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 R Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「赋值与特殊运算符」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 R Academy 课中编写并运行代码吗?

能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 算术与比较运算符
  2. 逻辑运算符与布尔逻辑
  3. 赋值与特殊运算符
  4. 运算符优先级与复杂表达式
← 返回 R Academy