R函数使用的参数是否固定?

问题描述

我对另一个问题有疑问,但我尝试将其分解为更简单的代码,以便可以看到我的最初问题。我尝试制作一个数据框和一个计算总和的函数,如下所示:

df <- data.frame(x=c(1,2,3),y=c(1,3))

fun <- function(data,x,y){

    z <- sum(data$x) + sum(data$y)
    return(z)
}

fun(data= df,x = df$x,y = df$y)
[1] 12

代码为我提供了预期的总和。12。将df数据帧的列名更改为例如“ r”和“ t” 即使我在函数中指定参数也返回0。怎么了?

  df <- data.frame(r=c(1,t=c(1,3))

    fun <- function(data,y){

        z <- sum(data$x) + sum(data$y)
        return(z)
    }
    
    fun(data= df,x = df$r,y = df$t)
[1] 0

谢谢。

解决方法

问题是第二个函数试图从x中提取变量ydata。这等效于执行data[["x"]],这不是您的意图。

相反,我们可以将变量作为字符传递,以获得预期的结果并将提取的内容从data$x转换为data[[x]]

df <- data.frame(r=c(1,2,3),t=c(1,3))

fun <- function(data,x,y){
  
  z <- sum(data[[x]]) + sum(data[[y]])
  return(z)
}

fun(data= df,x = "r",y = "t")
#> [1] 12

对于此特定示例,我们可以使用基本方法并使用非常干净的with()

with(df,sum(r) + sum(t))
,

我建议采用下一种方法。使用$查找数据帧时,您的代码看起来像。相反,您可以尝试以下方法:

#Data 1
df <- data.frame(x=c(1,y=c(1,3))

#Function

fun <- function(data,y){
  
  z <- sum(x) + sum(y)
  return(z)
}

#Apply

fun(data= df,x = df$x,y = df$y)

输出:

[1] 12

现在是第二个示例:

#Apply 2

df <- data.frame(r=c(1,3))

fun(data= df,x = df$r,y = df$t)

输出:

[1] 12