Как сделать самоанализ в R - PullRequest
5 голосов
/ 18 марта 2010

Я немного новичок в R, и у меня есть этот кусок кода, который генерирует переменную, тип которой я не знаю. Есть ли в R средство для самоанализа, которое скажет мне, к какому типу относится эта переменная?

Следующее иллюстрирует свойство этой переменной:

Я работаю над выбором линейной модели, и у меня есть ресурс lm, полученный из другой модели. Теперь я хочу получить вызов lm с помощью вызова $ summary (model) для команды, чтобы мне не нужно было жестко кодировать структуру модели. Однако, так как мне нужно изменить набор данных, мне нужно немного изменить «строку», но, очевидно, это не простая строка. Интересно, есть ли какая-либо команда, похожая на string.replace, чтобы я мог манипулировать этой переменной из переменной $ call.

> str<-summary(rdnM)$call
> str
lm(formula = y ~ x1, data = rdndat)
> str[1]
lm()
> str[2]
y ~ x1()
> str[3]
rdndat()
> str[3] <- data
Warning message:
In str[3] <- data :
  number of items to replace is not a multiple of replacement length
> str
lm(formula = y ~ x1, data = c(10, 20, 30, 40))
> str<-summary(rdnM)$call
> str
lm(formula = y ~ x1, data = rdndat)
> str[3] <- 'data'
> str
lm(formula = y ~ x1, data = "data")
> str<-summary(rdnM)$call
> type str
Error: unexpected symbol in "type str"
> 

1 Ответ

5 голосов
/ 18 марта 2010

С точки зрения самоанализа: R позволяет легко исследовать и оперировать языковыми объектами.
Подробнее см. Определение языка R , в частности разделы 2 и 6. Например, в вашем случае итоговый (rdnM) $ call является объектом "call". Вы можете получить его фрагменты с помощью индексации, но вы не можете создать другой объект вызова, назначив индексы так, как вы пытаетесь это сделать. Вам нужно будет создать новый вызов.

В вашем случае вы создаете обновленный вызов lm () из существующего вызова. Если вы хотите повторно использовать формулу для других данных, вы должны извлечь формулу из объекта вызова с помощью formula(foo$call), например:

 foo <- lm(formula = y ~ x1, data = data.frame(y=rnorm(10),x1=rnorm(10)))
 bar <- lm(formula(foo$call), data = data.frame(y=rnorm(10),x1=rnorm(10)))

С другой стороны, если вы пытаетесь обновить формулу, вы можете использовать update():

baz <- update(bar, . ~ . - 1)
baz$call
##>lm(formula = y ~ x1 - 1, data = data.frame(y = rnorm(10), x1 = rnorm(10)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...