2016-03-24 2 views
0

В линейной функции модели, можно написать:R ссылающихся файл данных

result <- lm(r ~ N, data = ds) 

Функция знает, смотреть в dataframe DS для переменных г и N

Я написал функцию с именем Check.Data. Аргументы ri и ni являются переменными в файле данных ds.

Check.Data(ri = ds$r, ni = ds$N, data = ds) #This runs 
Check.Data(ri = r, ni = N, data = ds) #this does not 

Второй вызов функции не работает, потому что он не может найти г: Ошибка в Check.Data (п = г, п = N, данные = DS): объект 'R' не найден

Какие команды мне нужны в функции, чтобы знать, что аргументы для ri и ni являются переменными в ds, не указывая набор данных (например, ri = ds $ r, ni = ds $ N)?

В случае, если вы хотите взглянуть на функции, здесь:

Check.Data <- function(ri= ri, ni=ni, data = data) 
    { 

    #make sure values needed are non-missing 
    if (missing(data)) stop("Function CheckData is terminated because data set name is missing.") 

    if (missing(ri)) stop("Function CheckData is terminated because ri is missing.") 

    if (missing(ni)) stop("Function CheckData is terminated because ni is missing.") 

    #add ri and ni to the data frame named data 
    data$ri <- ri 
    data$ni <- ni 

    #make sure ri is numeric 
    if(is.numeric(data$ri) == FALSE) stop("Function CheckData is terminated because ri is not numeric.") 

    #make sure ni is numeric 
    if(is.numeric(data$ni) == FALSE) stop("Function CheckData is terminated because ni is not integer.") 


    #does ri have any missing data. if so issue message and stop 
    if(any(ind.na <- is.na(data$ri))) stop(paste("ri has", sum(ind.na), "missing values. CheckData is terminated.")) 

    #does ni have any missing data. if so issue message and stop 
    if(any(ind.na <- is.na(data$ni))) stop(paste("ni has", sum(ind.na), "missing values. CheckData is terminated.")) 

} 
+2

«The конкретных командами» будет зависеть от того, что именно вы планируете делать с этими переменными. Техника, которую вы описываете, называется нестандартной оценкой, [это] (http://adv-r.had.co.nz/Computing-on-the-language.html) - хорошее введение. Тем не менее, я бы тщательно рассмотрел вопрос о том, стоит ли использовать возможность «ri = r» вместо «ri =» r »' трудности и сложность реализации нестандартной оценки. – joran

+0

Ew, используя '' 'функции внутри, определенно не рекомендуется. Это только удобная функция для использования на консольном уровне. Научитесь использовать '[[' вместо. –

ответ

2

функции R, как правило, пытаются оценить их формальные аргументы в среде, где они называли. Столбцы объектов не являются объектами первого класса в R, поэтому, если в вызывающей среде нет векторов (или других объектов данных) с именами r и N, второй тип вызова завершится неудачно (если вы не предпримете особых усилий). Вы надеетесь, что функция вместо этого оценит некоторые аргументы как символы в среде data. Как отмечает Йоран, это называется NSE (нестандартная оценка). Одна из наиболее часто используемых функций - library или ее близкий родственник require. Вы можете видеть, что первая операция в require - это преобразование символьной строки в значение символа. Затем можно безопасно использовать для доступа к значениям столбцов с [ -функция

myNSEfun <- function(ri = r, ni = N, data = ds){ 
       ri.col <- as.character(substitute(ri.col)) 
       ni.col <- as.character(substitute(ni.col)) 
       print(summary(data[ c(ri.col, ni.col) ])) }