按传递给函数

时间:2018-06-18 17:39:47

标签: r

我想编写一个按列排序的函数。这个基本练习当然多次被问过,但是解决方案建议depend on the literal,因此不能在函数中使用(heretherethere ),或者需要dependence on the column ordering,这使得编程变得脆弱(here)。

我正在寻找的东西显然被称为“参考透明度”。精细。但似乎采用这个术语,至少在本例中,会导致using very many words定义和区分程序中的文字。因此MWE是最好的。

函数sort.by.column的正文应该包含什么,以便

sort.by.column <- function(df, column.name) {
    ## ??
}

df1 <- data.frame(Instrument=c("B","A"),
                  Value=c(3,2))
df2 <- data.frame(Device=c("D","C"),
                  Value=c(5,4))
column.name.1 <- "Instrument"
sorted1 <- sort.by.column(df1, column.name.1)
column.name.2 <- "Device"
sorted2 <- sort.by.column(df2, column.name.2)

适用于df1df2

3 个答案:

答案 0 :(得分:1)

以下是dplyr::arrange采用文字的包装器:

library(dplyr)
sort.by.column <- function(df, column.name) {
  col <- sym(column.name)
  arrange(df, !!col)
}

答案 1 :(得分:0)

您可以使用sum-9将函数sort.by.column编写为:

order

数据:

sort.by.column <- function(df, column.name) {
  df[order(df[,column.name]),]
}    

#Lets test the function

sort.by.column(df1, "Value")
#   Instrument Value
# 2          B     2
# 1          A     3
sort.by.column(df2, "Value")
#   Device Value
# 2      D     4
# 1      C     5

sort.by.column(df1, "Instrument")
#   Instrument Value
# 1          A     3
# 2          B     2
sort.by.column(df2, "Device")
#   Device Value
# 1      C     5
# 2      D     4

<强>解释

它的工作原理如下。初始化

df1 <- data.frame(Instrument=c("A","B"),
                  Value=c(3,2))
df2 <- data.frame(Device=c("C","D"),
                  Value=c(5,4))

表达式

df <- data.frame(Instrument=c("B","A"), Value=c(3,2))
col.name <- "Instrument"

返回数据帧的1列子集。表达式

df[,col.name]

对该子集进行排序,返回行的索引。最后

order(df[,col.name])

返回数据帧的行子集,其中行索引按计算顺序。

答案 2 :(得分:0)

我在这里收集确认,比较和理解的解决方案。

s1 <- function(df, column.name) {
    #library(dplyr)    
    dplyr::arrange_(df, column.name)
}


# version which does not require a `library(dplyr)` call
a50915367 <- function(df, column.name) {
    # library(dplyr)
    col <- rlang::sym(column.name) # dplyr::sym also works
    dplyr::arrange(df, rlang::`!!`(col))    
}

library(dplyr) # required before function
a50915367 <- function(df, column.name) {
    col <- sym(column.name) 
    arrange(df, !!col)    
}

a50915313 <- function(df, column.name) {
    df[order(df[,column.name]),]
}

f <- function(sorting.function) {
    df1 <- data.frame(Instrument=c("B","A"), Value=c(3,2))
    df2 <- data.frame(Device=c("D","C"), Value=c(5,4))

    column.name.1 <- "Instrument"
    sorted1 <- sorting.function(df1, column.name.1)
    column.name.2 <- "Device"
    sorted2 <- sorting.function(df2, column.name.2)

    ret.list <- list(r1=sorted1,
                     r2=sorted2)
    ret.list
}

g <- function() {
    cat("----------------1----------------\n")
    print(f(s1))
    cat("----------------a50915367----------------\n")
    print(f(a50915367))
    cat("----------------a50915313----------------\n")
    print(f(a50915313))
}

g()