R 使用 formals() 更改默认值不适用于 sort()

R Changing default values with formals() does not work for sort()

我意识到使用 formals(sort)$decreasing <- TRUE 并没有像我预期的那样更改默认值,而 formals(sample)$replace <- TRUE 完成了它的工作。

重现问题:

# does not work
sort(1:5)
formals(sort)$decreasing <- TRUE
sort(1:5)
args(sort)  # default apparently changed correctly, but output did not

# works fine
sample(1:2, 3)
formals(sample)$replace <- TRUE
sample(1:2, 3)

我很好奇为什么 formals() 显然只适用于某些函数以及我将如何更改默认值!

我使用 R 3.4.2

请注意,与 sample() 不同,sort() 是 R 中的通用函数。如果您只键入 sort 而没有括号,您可以看到它调用了 useMethod() 这就是它触发 S3 通用行为的方式。那里的代码实际上并没有得到 "run",它只是根据您传递给它的对象的 class 启动正确版本的排序。但是,您可以这样做

sort(1:5)
# [1] 1 2 3 4 5
formals(sort.default)$decreasing <- TRUE
sort(1:5)
# [1] 5 4 3 2 1

当然,改变内置函数的行为通常是一个糟糕的想法。实际上,这是使用全局环境中的不同设置制作 sort() 的卷影副本。原始排序仍可在

base::sort.default(1:5)
# [1] 1 2 3 4 5