Как создать функцию, используя переменные в кадре данных - PullRequest
3 голосов
/ 14 апреля 2020

Я уверен, что вопрос немного глуповат (извините) ... Я пытаюсь создать функцию, используя разные переменные, которые я сохранил в Dataframe. Функция выглядит так:

mlr_turb <- function(Cond_in, Flow_in, pH_in, pH_out, Turb_in, nm250_i, nm400_i, nm250_o, nm400_o){

     Coag = (+0.032690 + 0.090289*Cond_in + 0.003229*Flow_in - 0.021980*pH_in - 0.037486*pH_out 
             +0.016031*Turb_in  -0.026006*nm250_i +0.093138*nm400_o - 0.397858*nm250_o - 0.109392*nm400_o)/0.167304

    return(Coag)
    }

m4_turb <- mlr_turb(dataset)  

Проблема в том, что я пытаюсь запустить свою функцию в кадре данных (с тем же именем переменных). Он не определяет мои переменные и показывает это сообщение:

Error in mlr_turb(dataset) : 
  argument "Flow_in" is missing, with no default

Но, на самом деле, есть и все переменные.

Я думаю, что упустил или пропустил какой-то порядок в функции, которая дает ему возможность взять переменные из набора данных. Я много об этом искал, но не нашел ответа ...

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Вы встречаете стандартную проблему при написании R, которая связана с вопросом standard evaluation (SE) против non standard evaluation (NSE). Если вам нужно больше элементов, вы можете взглянуть на это сообщение в блоге, которое я написал

Я думаю, что наиболее удобный способ написать функцию с использованием переменных - это использовать имена переменных в качестве аргументов функции. ,

Давайте снова рассмотрим пример @Muon.

# a simple function that takes x, y and z as arguments 
myFun <- function(x, y, z){
  result <- (x + y)/z
  return(result)
}

Вопрос в том, где R должен найти значения за именами x, y и z. В функции R сначала просматривает функциональную среду (здесь x, y и z определяются как параметры), затем просматривает глобальную среду, а затем просматривает различные присоединенные пакеты.

В myFun, R ожидает векторы. Если вы дадите имя столбцу, вы увидите ошибку. Что произойдет, если вы хотите дать имя столбцу? Вы должны сказать R, что имя, которое вы дали, должно быть связано со значением в области данных. Например, вы можете сделать что-то подобное:

myFun <- function(df, col1 = "x", col2 = "y", col3 = "z"){
  result <- (df[,col1] + df[,col2])/df[,col3]
  return(result)
}

Вы можете go гораздо дальше в этом аспекте с пакетом data.table. Если вы начинаете писать функции, которые должны использовать переменные из фрейма данных, я рекомендую вам начать смотреть на этот пакет

2 голосов
/ 14 апреля 2020

Никаких глупых вопросов!

Я думаю, вы ищете do.call . Эта функция позволяет распаковывать значения в функцию в качестве аргументов. Вот действительно простой пример.

# a simple function that takes x, y and z as arguments 
myFun <- function(x, y, z){
  result <- (x + y)/z
  return(result)
}

# a simple data frame with columns x, y and z
myData <- data.frame(x=1:5,
                     y=(1:5)*pi,
                     z=(11:15))

# unpack the values into the function using do.call
do.call('myFun', myData)

Вывод:

[1] 0.3765084 0.6902654 0.9557522 1.1833122 1.3805309
...