如何将函数参数传递给内部?

时间:2010-11-04 12:50:48

标签: r

我想知道如何将某个函数的参数传递给使用with / within的函数的子部分。例如:

  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 个答案:

答案 0 :(得分:3)

尝试

   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

答案 1 :(得分:2)

我认为这是通过...指令完成的: E.g:

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

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

...是一个占位符,用于传递给“anotherfunction”的其他参数。

答案 2 :(得分:1)

您错过了col1({1}}(来自您)和用户工作区中不存在col2dataframe这一事实。

基本上,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

在您的第一个示例中(请不要编辑错误消息等,请准确告诉我们您运行的代码以及生成的错误)环境中不存在col1col2在其中评估您的表达式。

此外,您似乎希望在col1的列(组件)的col2dataframe 名称中存储。 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()能够找到具有所需名称的对象并将其包含在表达

但是在这一点上,你正试图跳过太多的箍,因为你的问题并不具体。我认为你这是因为我对你之前的Q的回答here而问这个问题。答案提出了比attach()更好的选择。但是你不清楚那里有什么论点或你真正想做的事情。如果我现在知道你真正想做什么,那么我建议你使用上面的DWin答案。

您似乎不想对列/组件名称进行硬编码。如果您可以硬编码,这将是解决方案:

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

但是看到你不想硬编码,你需要一个get()版本或DWin的解决方案。