R: Пример выполнения функции пакета: странное поведение

Я не очень понимаю, почему поведение example отличается, если я ввожу имя строки вручную, когда я использую ls функция. Рассмотрим функцию ниже:

> ls("package:LIM")[1]
[1] "FILERigaAutumn"

Если я приведу пример так:

> example(ls("package:LIM")[1])
Warning message:
In example(ls("package:LIM")[1]) : no help found for ‘ls("package:LIM")[1]’

И, похоже, не выполнить пример. Но когда я запускаю его напрямую:

> example("FILERigaAutumn")

Я получаю много выходных данных и пример выполнен.

Тип передаваемого аргумента выглядит одинаково:

> typeof("FILERigaAutumn")
[1] "character"
> typeof( ls("package:LIM")[1])
[1] "character"

У кого-нибудь есть идеи почему? Я хочу вычислить время выполнения всех примеров в одном пакете:

for (func in ls("package:LIM")){system.time(example(func))}

1 ответ

Решение

library, require, example и, возможно, несколько других функций можно использовать с кавычками и без них:

example(runif)

example("runif")

Чтобы разрешить версию без кавычек, эти функции преобразуют первый аргумент в символ (без его оценки), вызывая:

deparse(subsitute(x))

в результате чего:

deparse(substitute(ls("package:LIM")[1]))
# [1] "ls(\"package:LIM\")[1]"

Чтобы обойти это (оценить аргумент), вы должны использовать character.only аргумент.

example(ls("package:LIM")[1], character.only=TRUE)

ИМХО такое поведение не очень последовательное (character.only=TRUE должно быть по умолчанию), и я не вижу никаких преимуществ (хорошо, вы можете использовать завершение табуляции в не цитируемой версии).

Другие вопросы по тегам