Как передать аргументы функции изнутри? - PullRequest
1 голос
/ 04 ноября 2010

Интересно, как я могу передать аргументы некоторой функции в часть функции, которая использует с / внутри например:

  myfunction <- function(dataframe,col1,col2){

  res <- within(dataframe, somenewcol <-paste(col1,"-","col2",sep=""))

  return(res)


  }

где col1 и col2 - столбцы, содержащиеся в кадре данных. Как правильно передать аргументы col1 и col2 внутри выражения? Когда я просто пытаюсь его использовать, я получаю:

Ошибка в вставке (col1, "-",,: объект 'Some_passed_col' не найден

Вот пример:

   dataset <- data.frame(rnorm(20),2001:2020,rep(1:10,2))
   names(dataset) <- c("mydata","col1","col2")

   myfunction <- function(dataframe,arg1,arg2){
   res <- with(dataframe, onesinglecol <- paste(arg1,"-","arg2",sep=""))
   return(res)



   }
# call function
myfunction(dataset,col1,col2)

РЕДАКТИРОВАТЬ:

the following works for me now, but I cannot completely understand why... so any further explanation is appreciated:

 myfunction(dataset,arg1="col1",arg2="col2")

если я отрегулирую

res <- with(dataframe, onesinglecol <- paste(get(arg1),"-",get(arg2),sep=""))

Ответы [ 3 ]

3 голосов
/ 04 ноября 2010

Попробуйте

   myfunction <- function(dataframe,arg1,arg2){
   dataframe["onesinglecol"] <- dataframe[[arg1]] -dataframe[[arg2]]
   return(dataframe) 
   }

И вызовите его с символьными именами столбцов, а не с именами объектов, которые нигде не определены:

myfunction(dataset,"col1","col2")
       mydata col1 col2 onesinglecol
1   0.6834402 2001    1         2000
2   1.6623748 2002    2         2000
3  -0.5769926 2003    3         2000  .... etc
2 голосов
/ 04 ноября 2010

Я думаю, что это делается с помощью директивы ...: E.g.:

myfunction <- function(dataframe, ...){

  var <- anotherfunction( arg1= 1, arg2 = 2 , ...)
  return(var)
}

... является заполнителем для дополнительных аргументов, передаваемых через "anotherfunction".

1 голос
/ 04 ноября 2010

Вам не хватает того факта, что col1 и col2 не существуют ни в dataframe (из вашего), ни в рабочей области пользователя.

В основном with() и within() работают так:

> foo <- 10
> bar <- data.frame(FOO = 10)
> FOO + foo
Error: object 'FOO' not found
> with(bar, FOO + foo)
[1] 20

В первом случае FOO не был найден, поскольку он находится внутри bar. Во втором случае мы устанавливаем среду, в которой оценивается наше выражение. Внутри этой среды FOO существует. foo также находится в рабочей области.

В вашем первом примере (пожалуйста, не редактируйте сообщения об ошибках и т. Д., Покажите нам точно, какой код вы запустили и какую ошибку вызвали) либо один col1, либо col2 не существовал в среде, созданной для Выражение было оценено.

Кроме того, вы хотите сохранить в col1 и col2 имя столбца (компонента) вашего dataframe. DWin показал вам один из способов использования этой информации. Альтернатива, поддерживающая использование within(), заключается в использовании get() следующим образом:

res <- within(dataframe, somenewcol <- paste(get(col1), "-", get(col2), sep=""))

Почему это работает, согласно вашим дополнительным изменениям и затруднениям, в том, что get() возвращает объект с именем по его первому аргументу. get("foo") вернет объект с именем foo (продолжение моего примера выше):

get ("foo") ## находит foo и возвращает его 1 10

В вашем примере у вас есть фрейм данных с именами среди прочего "col1" и "col2". Вы изменили свой код на get(arg1) (где arg1 <- "col1"), где вы просите get() вернуть объект с именем "col1" из среды оценки, видимой во время оценки вашей функции. Так как ваш dataframe содержал компонент col1, который был видим, потому что within() сделал его доступным, get() смог найти объект с требуемым именем и включить его в выражение.

Но в этот момент вы пытаетесь прыгнуть через слишком много обручей, потому что ваши вопросы не были конкретными. Я предполагаю, что вы спрашиваете об этом из-за моего ответа здесь на ваш предыдущий вопрос. Этот ответ предложил лучшую альтернативу, чем attach(). Но вам не было ясно, каковы были некоторые аргументы или что вы действительно хотели сделать. Если бы я знал сейчас, что вы действительно хотите сделать, я бы предложил вам использовать ответ DWin выше.

Похоже, вы не хотите жестко кодировать имена столбцов / компонентов. Если бы вы могли написать жесткий код, это было бы решением:

res <- within(dataframe, somenewcol <- paste(col1, "-", col2, sep = ""))

Но если вы не хотите писать жесткий код, вам нужна версия get() или решение DWin.

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