Изменить аргумент (ы) по умолчанию методов S3 в R - PullRequest
0 голосов
/ 11 мая 2018

Можно ли изменить аргумент (ы) по умолчанию для методов S3 в R?

Достаточно легко изменить аргументы, используя формалы ...

# return default arguments of table
> args(table)
function (..., exclude = if (useNA == "no") c(NA, NaN), useNA = c("no", 
"ifany", "always"), dnn = list.names(...), deparse.level = 1) 

# Update an argument
> formals(table)$useNA <- "always"

# Check change
> args(table)
function (..., exclude = if (useNA == "no") c(NA, NaN), useNA = "always", 
dnn = list.names(...), deparse.level = 1) 

Но не методы S3 ...

# View default argument of S3 method
> formals(utils:::str.default)$list.len
[1] 99

# Attempt to change
> formals(utils:::str.default)$list.len <- 99
Error in formals(utils:::str.default)$list.len <- 99 : 
object 'utils' not found

1 Ответ

0 голосов
/ 11 мая 2018

При щедром подсказке @ nicola здесь есть вариант ответа на комментарии:

Вы можете редактировать методы S3 и другие неэкспортированные функции, используя assignInNamespace().Это позволяет вам заменить функцию в данном пространстве имен новой пользовательской функцией (fixInNamespace() откроет целевую функцию в редакторе, чтобы вы могли внести изменения).

# Take a look at what we are going to change
formals(utils:::str.default)$list.len
#> [1] 99    

# extract the whole function from utils namespace
f_to_edit <- utils:::str.default
# make the necessary alterations
formals(f_to_edit)$list.len<-900
# Now we substitute our new improved version of str.default inside
# the utils namespace
assignInNamespace("str.default", f_to_edit, ns = "utils")

# and check the result
formals(utils:::str.default)$list.len
#> [1] 900

Если вы перезапуститеВ сеансе R вы восстановите значения по умолчанию (или вы можете вернуть их вручную в текущем сеансе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...