与 map()
及其变体始终返回固定对象类型(map()
的列表、map_int()
的整数向量等)不同,modify()
系列始终返回与输入对象相同的类型。
-
modify()
是x[[i]] <- f(x[[i]]); return(x)
的快捷方式。 -
modify_if()
仅修改x
中满足谓词的元素,其他元素保持不变。modify_at()
仅修改由名称或位置给出的元素。 -
modify2()
修改.x
的元素,但也将.y
的元素传递给.f
,就像map2()
一样。imodify()
将名称或索引传递给.f
,就像imap()
一样。 -
modify_in()
修改pluck()
位置中的单个元素。
用法
modify(.x, .f, ...)
modify_if(.x, .p, .f, ..., .else = NULL)
modify_at(.x, .at, .f, ...)
modify2(.x, .y, .f, ...)
imodify(.x, .f, ...)
参数
- .x
-
一个向量。
- .f
-
以与相应的映射函数相同的方式指定的函数。
- ...
-
传递给映射函数的附加参数。
我们现在通常建议不要使用
...
将附加(常量)参数传递给.f
。相反,使用简写匿名函数:# Instead of x |> map(f, 1, 2, collapse = ",") # do: x |> map(\(x) f(x, 1, 2, collapse = ","))
这使得更容易理解哪些参数属于哪个函数,并且往往会产生更好的错误消息。
- .p
-
单个谓词函数、说明此类谓词函数的公式或与
.x
长度相同的逻辑向量。或者,如果.x
的元素本身是对象列表,则为指示内部列表中逻辑元素名称的字符串。只有.p
计算结果为TRUE
的元素才会被修改。 - .else
-
应用于
.x
元素的函数,其中.p
返回FALSE
。 - .at
-
给出要选择的元素的逻辑向量、整数向量或字符向量。或者,函数接受名称向量,并返回要选择的元素的逻辑向量、整数向量或字符向量。
:如果安装了 tidyselect 软件包,则可以使用
vars()
和 tidyselect 帮助器来选择元素。 - .y
-
向量,通常与
.x
长度相同。
通用性
modify()
和变体对于实现 length()
、 [[
和 [[<-
方法的类是通用的。如果默认实现与您的类不兼容,您可以使用自己的方法覆盖它们。
如果您实现自己的 modify()
方法,请确保它满足以下不变量:
modify(x, identity) === x
modify(x, compose(f, g)) === modify(x, g) |> modify(f)
这些不变量在计算机科学中被称为functor laws。
例子
# Convert factors to characters
iris |>
modify_if(is.factor, as.character) |>
str()
#> 'data.frame': 150 obs. of 5 variables:
#> $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#> $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#> $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#> $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#> $ Species : chr "setosa" "setosa" "setosa" "setosa" ...
# Specify which columns to map with a numeric vector of positions:
mtcars |> modify_at(c(1, 4, 5), as.character) |> str()
#> 'data.frame': 32 obs. of 11 variables:
#> $ mpg : chr "21" "21" "22.8" "21.4" ...
#> $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
#> $ disp: num 160 160 108 258 360 ...
#> $ hp : chr "110" "110" "93" "110" ...
#> $ drat: chr "3.9" "3.9" "3.85" "3.08" ...
#> $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
#> $ qsec: num 16.5 17 18.6 19.4 17 ...
#> $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
#> $ am : num 1 1 1 0 0 0 0 0 0 0 ...
#> $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
#> $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
# Or with a vector of names:
mtcars |> modify_at(c("cyl", "am"), as.character) |> str()
#> 'data.frame': 32 obs. of 11 variables:
#> $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
#> $ cyl : chr "6" "6" "4" "6" ...
#> $ disp: num 160 160 108 258 360 ...
#> $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
#> $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
#> $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
#> $ qsec: num 16.5 17 18.6 19.4 17 ...
#> $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
#> $ am : chr "1" "1" "1" "0" ...
#> $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
#> $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
list(x = sample(c(TRUE, FALSE), 100, replace = TRUE), y = 1:100) |>
list_transpose(simplify = FALSE) |>
modify_if("x", \(l) list(x = l$x, y = l$y * 100)) |>
list_transpose()
#> $x
#> [1] FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE FALSE TRUE TRUE
#> [12] FALSE TRUE TRUE TRUE FALSE TRUE FALSE TRUE FALSE TRUE TRUE
#> [23] FALSE TRUE TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE FALSE
#> [34] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
#> [45] FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE
#> [56] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE
#> [67] FALSE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
#> [78] FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE TRUE FALSE FALSE
#> [89] TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE TRUE
#> [100] TRUE
#>
#> $y
#> [1] 1 200 300 4 5 6 7 800 9 1000 1100
#> [12] 12 1300 1400 1500 16 1700 18 1900 20 2100 2200
#> [23] 23 2400 2500 26 27 2800 29 3000 31 3200 33
#> [34] 34 35 3600 37 38 39 40 41 4200 43 44
#> [45] 45 46 4700 48 49 5000 51 5200 53 5400 5500
#> [56] 56 5700 5800 59 60 61 62 63 6400 6500 66
#> [67] 67 6800 69 70 7100 7200 7300 7400 7500 76 77
#> [78] 78 79 8000 81 8200 83 8400 8500 8600 87 88
#> [89] 8900 9000 91 92 9300 9400 95 96 9700 98 9900
#> [100] 10000
#>
# Use modify2() to map over two vectors and preserve the type of
# the first one:
x <- c(foo = 1L, bar = 2L)
y <- c(TRUE, FALSE)
modify2(x, y, \(x, cond) if (cond) x else 0L)
#> foo bar
#> 1 0
# Use a predicate function to decide whether to map a function:
modify_if(iris, is.factor, as.character)
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1 5.1 3.5 1.4 0.2 setosa
#> 2 4.9 3.0 1.4 0.2 setosa
#> 3 4.7 3.2 1.3 0.2 setosa
#> 4 4.6 3.1 1.5 0.2 setosa
#> 5 5.0 3.6 1.4 0.2 setosa
#> 6 5.4 3.9 1.7 0.4 setosa
#> 7 4.6 3.4 1.4 0.3 setosa
#> 8 5.0 3.4 1.5 0.2 setosa
#> 9 4.4 2.9 1.4 0.2 setosa
#> 10 4.9 3.1 1.5 0.1 setosa
#> 11 5.4 3.7 1.5 0.2 setosa
#> 12 4.8 3.4 1.6 0.2 setosa
#> 13 4.8 3.0 1.4 0.1 setosa
#> 14 4.3 3.0 1.1 0.1 setosa
#> 15 5.8 4.0 1.2 0.2 setosa
#> 16 5.7 4.4 1.5 0.4 setosa
#> 17 5.4 3.9 1.3 0.4 setosa
#> 18 5.1 3.5 1.4 0.3 setosa
#> 19 5.7 3.8 1.7 0.3 setosa
#> 20 5.1 3.8 1.5 0.3 setosa
#> 21 5.4 3.4 1.7 0.2 setosa
#> 22 5.1 3.7 1.5 0.4 setosa
#> 23 4.6 3.6 1.0 0.2 setosa
#> 24 5.1 3.3 1.7 0.5 setosa
#> 25 4.8 3.4 1.9 0.2 setosa
#> 26 5.0 3.0 1.6 0.2 setosa
#> 27 5.0 3.4 1.6 0.4 setosa
#> 28 5.2 3.5 1.5 0.2 setosa
#> 29 5.2 3.4 1.4 0.2 setosa
#> 30 4.7 3.2 1.6 0.2 setosa
#> 31 4.8 3.1 1.6 0.2 setosa
#> 32 5.4 3.4 1.5 0.4 setosa
#> 33 5.2 4.1 1.5 0.1 setosa
#> 34 5.5 4.2 1.4 0.2 setosa
#> 35 4.9 3.1 1.5 0.2 setosa
#> 36 5.0 3.2 1.2 0.2 setosa
#> 37 5.5 3.5 1.3 0.2 setosa
#> 38 4.9 3.6 1.4 0.1 setosa
#> 39 4.4 3.0 1.3 0.2 setosa
#> 40 5.1 3.4 1.5 0.2 setosa
#> 41 5.0 3.5 1.3 0.3 setosa
#> 42 4.5 2.3 1.3 0.3 setosa
#> 43 4.4 3.2 1.3 0.2 setosa
#> 44 5.0 3.5 1.6 0.6 setosa
#> 45 5.1 3.8 1.9 0.4 setosa
#> 46 4.8 3.0 1.4 0.3 setosa
#> 47 5.1 3.8 1.6 0.2 setosa
#> 48 4.6 3.2 1.4 0.2 setosa
#> 49 5.3 3.7 1.5 0.2 setosa
#> 50 5.0 3.3 1.4 0.2 setosa
#> 51 7.0 3.2 4.7 1.4 versicolor
#> 52 6.4 3.2 4.5 1.5 versicolor
#> 53 6.9 3.1 4.9 1.5 versicolor
#> 54 5.5 2.3 4.0 1.3 versicolor
#> 55 6.5 2.8 4.6 1.5 versicolor
#> 56 5.7 2.8 4.5 1.3 versicolor
#> 57 6.3 3.3 4.7 1.6 versicolor
#> 58 4.9 2.4 3.3 1.0 versicolor
#> 59 6.6 2.9 4.6 1.3 versicolor
#> 60 5.2 2.7 3.9 1.4 versicolor
#> 61 5.0 2.0 3.5 1.0 versicolor
#> 62 5.9 3.0 4.2 1.5 versicolor
#> 63 6.0 2.2 4.0 1.0 versicolor
#> 64 6.1 2.9 4.7 1.4 versicolor
#> 65 5.6 2.9 3.6 1.3 versicolor
#> 66 6.7 3.1 4.4 1.4 versicolor
#> 67 5.6 3.0 4.5 1.5 versicolor
#> 68 5.8 2.7 4.1 1.0 versicolor
#> 69 6.2 2.2 4.5 1.5 versicolor
#> 70 5.6 2.5 3.9 1.1 versicolor
#> 71 5.9 3.2 4.8 1.8 versicolor
#> 72 6.1 2.8 4.0 1.3 versicolor
#> 73 6.3 2.5 4.9 1.5 versicolor
#> 74 6.1 2.8 4.7 1.2 versicolor
#> 75 6.4 2.9 4.3 1.3 versicolor
#> 76 6.6 3.0 4.4 1.4 versicolor
#> 77 6.8 2.8 4.8 1.4 versicolor
#> 78 6.7 3.0 5.0 1.7 versicolor
#> 79 6.0 2.9 4.5 1.5 versicolor
#> 80 5.7 2.6 3.5 1.0 versicolor
#> 81 5.5 2.4 3.8 1.1 versicolor
#> 82 5.5 2.4 3.7 1.0 versicolor
#> 83 5.8 2.7 3.9 1.2 versicolor
#> 84 6.0 2.7 5.1 1.6 versicolor
#> 85 5.4 3.0 4.5 1.5 versicolor
#> 86 6.0 3.4 4.5 1.6 versicolor
#> 87 6.7 3.1 4.7 1.5 versicolor
#> 88 6.3 2.3 4.4 1.3 versicolor
#> 89 5.6 3.0 4.1 1.3 versicolor
#> 90 5.5 2.5 4.0 1.3 versicolor
#> 91 5.5 2.6 4.4 1.2 versicolor
#> 92 6.1 3.0 4.6 1.4 versicolor
#> 93 5.8 2.6 4.0 1.2 versicolor
#> 94 5.0 2.3 3.3 1.0 versicolor
#> 95 5.6 2.7 4.2 1.3 versicolor
#> 96 5.7 3.0 4.2 1.2 versicolor
#> 97 5.7 2.9 4.2 1.3 versicolor
#> 98 6.2 2.9 4.3 1.3 versicolor
#> 99 5.1 2.5 3.0 1.1 versicolor
#> 100 5.7 2.8 4.1 1.3 versicolor
#> 101 6.3 3.3 6.0 2.5 virginica
#> 102 5.8 2.7 5.1 1.9 virginica
#> 103 7.1 3.0 5.9 2.1 virginica
#> 104 6.3 2.9 5.6 1.8 virginica
#> 105 6.5 3.0 5.8 2.2 virginica
#> 106 7.6 3.0 6.6 2.1 virginica
#> 107 4.9 2.5 4.5 1.7 virginica
#> 108 7.3 2.9 6.3 1.8 virginica
#> 109 6.7 2.5 5.8 1.8 virginica
#> 110 7.2 3.6 6.1 2.5 virginica
#> 111 6.5 3.2 5.1 2.0 virginica
#> 112 6.4 2.7 5.3 1.9 virginica
#> 113 6.8 3.0 5.5 2.1 virginica
#> 114 5.7 2.5 5.0 2.0 virginica
#> 115 5.8 2.8 5.1 2.4 virginica
#> 116 6.4 3.2 5.3 2.3 virginica
#> 117 6.5 3.0 5.5 1.8 virginica
#> 118 7.7 3.8 6.7 2.2 virginica
#> 119 7.7 2.6 6.9 2.3 virginica
#> 120 6.0 2.2 5.0 1.5 virginica
#> 121 6.9 3.2 5.7 2.3 virginica
#> 122 5.6 2.8 4.9 2.0 virginica
#> 123 7.7 2.8 6.7 2.0 virginica
#> 124 6.3 2.7 4.9 1.8 virginica
#> 125 6.7 3.3 5.7 2.1 virginica
#> 126 7.2 3.2 6.0 1.8 virginica
#> 127 6.2 2.8 4.8 1.8 virginica
#> 128 6.1 3.0 4.9 1.8 virginica
#> 129 6.4 2.8 5.6 2.1 virginica
#> 130 7.2 3.0 5.8 1.6 virginica
#> 131 7.4 2.8 6.1 1.9 virginica
#> 132 7.9 3.8 6.4 2.0 virginica
#> 133 6.4 2.8 5.6 2.2 virginica
#> 134 6.3 2.8 5.1 1.5 virginica
#> 135 6.1 2.6 5.6 1.4 virginica
#> 136 7.7 3.0 6.1 2.3 virginica
#> 137 6.3 3.4 5.6 2.4 virginica
#> 138 6.4 3.1 5.5 1.8 virginica
#> 139 6.0 3.0 4.8 1.8 virginica
#> 140 6.9 3.1 5.4 2.1 virginica
#> 141 6.7 3.1 5.6 2.4 virginica
#> 142 6.9 3.1 5.1 2.3 virginica
#> 143 5.8 2.7 5.1 1.9 virginica
#> 144 6.8 3.2 5.9 2.3 virginica
#> 145 6.7 3.3 5.7 2.5 virginica
#> 146 6.7 3.0 5.2 2.3 virginica
#> 147 6.3 2.5 5.0 1.9 virginica
#> 148 6.5 3.0 5.2 2.0 virginica
#> 149 6.2 3.4 5.4 2.3 virginica
#> 150 5.9 3.0 5.1 1.8 virginica
# Specify an alternative with the `.else` argument:
modify_if(iris, is.factor, as.character, .else = as.integer)
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1 5 3 1 0 setosa
#> 2 4 3 1 0 setosa
#> 3 4 3 1 0 setosa
#> 4 4 3 1 0 setosa
#> 5 5 3 1 0 setosa
#> 6 5 3 1 0 setosa
#> 7 4 3 1 0 setosa
#> 8 5 3 1 0 setosa
#> 9 4 2 1 0 setosa
#> 10 4 3 1 0 setosa
#> 11 5 3 1 0 setosa
#> 12 4 3 1 0 setosa
#> 13 4 3 1 0 setosa
#> 14 4 3 1 0 setosa
#> 15 5 4 1 0 setosa
#> 16 5 4 1 0 setosa
#> 17 5 3 1 0 setosa
#> 18 5 3 1 0 setosa
#> 19 5 3 1 0 setosa
#> 20 5 3 1 0 setosa
#> 21 5 3 1 0 setosa
#> 22 5 3 1 0 setosa
#> 23 4 3 1 0 setosa
#> 24 5 3 1 0 setosa
#> 25 4 3 1 0 setosa
#> 26 5 3 1 0 setosa
#> 27 5 3 1 0 setosa
#> 28 5 3 1 0 setosa
#> 29 5 3 1 0 setosa
#> 30 4 3 1 0 setosa
#> 31 4 3 1 0 setosa
#> 32 5 3 1 0 setosa
#> 33 5 4 1 0 setosa
#> 34 5 4 1 0 setosa
#> 35 4 3 1 0 setosa
#> 36 5 3 1 0 setosa
#> 37 5 3 1 0 setosa
#> 38 4 3 1 0 setosa
#> 39 4 3 1 0 setosa
#> 40 5 3 1 0 setosa
#> 41 5 3 1 0 setosa
#> 42 4 2 1 0 setosa
#> 43 4 3 1 0 setosa
#> 44 5 3 1 0 setosa
#> 45 5 3 1 0 setosa
#> 46 4 3 1 0 setosa
#> 47 5 3 1 0 setosa
#> 48 4 3 1 0 setosa
#> 49 5 3 1 0 setosa
#> 50 5 3 1 0 setosa
#> 51 7 3 4 1 versicolor
#> 52 6 3 4 1 versicolor
#> 53 6 3 4 1 versicolor
#> 54 5 2 4 1 versicolor
#> 55 6 2 4 1 versicolor
#> 56 5 2 4 1 versicolor
#> 57 6 3 4 1 versicolor
#> 58 4 2 3 1 versicolor
#> 59 6 2 4 1 versicolor
#> 60 5 2 3 1 versicolor
#> 61 5 2 3 1 versicolor
#> 62 5 3 4 1 versicolor
#> 63 6 2 4 1 versicolor
#> 64 6 2 4 1 versicolor
#> 65 5 2 3 1 versicolor
#> 66 6 3 4 1 versicolor
#> 67 5 3 4 1 versicolor
#> 68 5 2 4 1 versicolor
#> 69 6 2 4 1 versicolor
#> 70 5 2 3 1 versicolor
#> 71 5 3 4 1 versicolor
#> 72 6 2 4 1 versicolor
#> 73 6 2 4 1 versicolor
#> 74 6 2 4 1 versicolor
#> 75 6 2 4 1 versicolor
#> 76 6 3 4 1 versicolor
#> 77 6 2 4 1 versicolor
#> 78 6 3 5 1 versicolor
#> 79 6 2 4 1 versicolor
#> 80 5 2 3 1 versicolor
#> 81 5 2 3 1 versicolor
#> 82 5 2 3 1 versicolor
#> 83 5 2 3 1 versicolor
#> 84 6 2 5 1 versicolor
#> 85 5 3 4 1 versicolor
#> 86 6 3 4 1 versicolor
#> 87 6 3 4 1 versicolor
#> 88 6 2 4 1 versicolor
#> 89 5 3 4 1 versicolor
#> 90 5 2 4 1 versicolor
#> 91 5 2 4 1 versicolor
#> 92 6 3 4 1 versicolor
#> 93 5 2 4 1 versicolor
#> 94 5 2 3 1 versicolor
#> 95 5 2 4 1 versicolor
#> 96 5 3 4 1 versicolor
#> 97 5 2 4 1 versicolor
#> 98 6 2 4 1 versicolor
#> 99 5 2 3 1 versicolor
#> 100 5 2 4 1 versicolor
#> 101 6 3 6 2 virginica
#> 102 5 2 5 1 virginica
#> 103 7 3 5 2 virginica
#> 104 6 2 5 1 virginica
#> 105 6 3 5 2 virginica
#> 106 7 3 6 2 virginica
#> 107 4 2 4 1 virginica
#> 108 7 2 6 1 virginica
#> 109 6 2 5 1 virginica
#> 110 7 3 6 2 virginica
#> 111 6 3 5 2 virginica
#> 112 6 2 5 1 virginica
#> 113 6 3 5 2 virginica
#> 114 5 2 5 2 virginica
#> 115 5 2 5 2 virginica
#> 116 6 3 5 2 virginica
#> 117 6 3 5 1 virginica
#> 118 7 3 6 2 virginica
#> 119 7 2 6 2 virginica
#> 120 6 2 5 1 virginica
#> 121 6 3 5 2 virginica
#> 122 5 2 4 2 virginica
#> 123 7 2 6 2 virginica
#> 124 6 2 4 1 virginica
#> 125 6 3 5 2 virginica
#> 126 7 3 6 1 virginica
#> 127 6 2 4 1 virginica
#> 128 6 3 4 1 virginica
#> 129 6 2 5 2 virginica
#> 130 7 3 5 1 virginica
#> 131 7 2 6 1 virginica
#> 132 7 3 6 2 virginica
#> 133 6 2 5 2 virginica
#> 134 6 2 5 1 virginica
#> 135 6 2 5 1 virginica
#> 136 7 3 6 2 virginica
#> 137 6 3 5 2 virginica
#> 138 6 3 5 1 virginica
#> 139 6 3 4 1 virginica
#> 140 6 3 5 2 virginica
#> 141 6 3 5 2 virginica
#> 142 6 3 5 2 virginica
#> 143 5 2 5 1 virginica
#> 144 6 3 5 2 virginica
#> 145 6 3 5 2 virginica
#> 146 6 3 5 2 virginica
#> 147 6 2 5 1 virginica
#> 148 6 3 5 2 virginica
#> 149 6 3 5 2 virginica
#> 150 5 3 5 1 virginica
相关用法
- R purrr modify_in 修改拔取位置
- R purrr modify_tree 递归修改列表
- R purrr map_if 有条件地将函数应用于向量的每个元素
- R purrr map2 映射两个输入
- R purrr map_depth 在给定深度映射/修改元素
- R purrr map_dfr 返回数据帧的函数
- R purrr map 将函数应用于向量的每个元素
- R purrr accumulate 累积向量缩减的中间结果
- R purrr imap 将函数应用于向量的每个元素及其索引
- R purrr list_transpose 转置列表
- R purrr as_vector 将列表强制转换为向量
- R purrr array-coercion 强制数组列出
- R purrr auto_browse 包装一个函数,以便在出错时自动 browser()
- R purrr pluck 安全地获取或设置嵌套数据结构深处的元素
- R purrr insistently 将函数转换为等待,然后在错误后重试
- R purrr list_simplify 将列表简化为原子或 S3 向量
- R purrr rerun 多次重新运行表达式
- R purrr quietly 包装一个函数来捕获副作用
- R purrr list_flatten 压平列表
- R purrr pmap 同时映射多个输入(“并行”)
- R purrr possibly 包装函数以返回值而不是错误
- R purrr head_while 查找全部满足谓词的头/尾。
- R purrr rbernoulli 从伯努利分布生成随机样本
- R purrr rate-helpers 创建延迟率设置
- R purrr keep_at 根据元素的名称/位置保留/丢弃元素
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Modify elements selectively。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。