我想知道如何将某个函数的参数传递给使用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=""))
答案 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}}(来自您)和用户工作区中不存在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()
能够找到具有所需名称的对象并将其包含在表达
但是在这一点上,你正试图跳过太多的箍,因为你的问题并不具体。我认为你这是因为我对你之前的Q的回答here而问这个问题。答案提出了比attach()
更好的选择。但是你不清楚那里有什么论点或你真正想做的事情。如果我现在知道你真正想做什么,那么我建议你使用上面的DWin答案。
您似乎不想对列/组件名称进行硬编码。如果您可以硬编码,这将是解决方案:
res <- within(dataframe, somenewcol <- paste(col1, "-", col2, sep = ""))
但是看到你不想硬编码,你需要一个get()
版本或DWin的解决方案。