【问题标题】:How to refer to an object inside a function in R?如何在 R 中引用函数内部的对象?
【发布时间】:2018-10-09 21:30:13
【问题描述】:

从多个字符串构建数据框名称时,如何在函数中引用我的数据框?

a <- c(1:6)
b <- c("05/12/2012 05:00","05/12/2012 06:00","06/12/2012 05:00",
   "06/12/2012 06:00", "07/12/2012 09:00","07/12/2012 07:00")
c <-c("0","0","0","1","1","1")
d <-c("12", "12", "13", "15", "16", "17") 
dataframenumber4 <- data.frame(a,b,c,d,stringsAsFactors = FALSE)

我想从我的数据框中选择一个值。

dataframenumber4[1,4] 

[1] 12

但我也想构建一个函数,因为我有多个要从中选择的数据框:

selectvalue <- function(dataframe, number){
paste0(dataframe,number)[1,4]
}

selectvalue("dataframe", "number4") 

[1] NA NA NA

我认为这是不对的,因为 R 没有将我的小字符串识别为对象名称。所以我试图修复它:

 selectvalue <- function(dataframe, number){
eval(paste0(dataframe,number))[1,4]
}

selectvalue("dataframe", "number4")

返回“评估错误(paste0(dataframe,number,quote = FALSE))[1,4]:维数不正确”

我在我的函数中尝试了多种方法,但我无法让 R 识别出我正在尝试将我的数据框提供给它。我怎样才能解决这个问题?

【问题讨论】:

  • 对 R 更友好的方式是将这些数据帧放在一个列表中(dfs &lt;- list(dataframe1, dataframe2),然后使用dfs[[i]] 访问。
  • @Aaron 已正确指出。创建数据框列表并使用[[ 运算符访问它们总是更好。

标签: r function object dataframe eval


【解决方案1】:

您可以使用get 函数按对象名称访问对象。 data.frame 的名称是使用paste0(dataframe,number) 准备的,然后您可以使用该名称调用get 来访问数据帧。因此你的函数可以写成:

selectvalue <- function(dataframe, number){
  get(paste0(dataframe,number))[1,4]

}

selectvalue("dataframenumber",4)
[1] "12"

上述功能符合 OP 的预期,但我应该建议对该功能进行一些改进:

  1. 数据帧的名称可以由调用者直接传递。无需在函数中准备数据框的名称。
  2. 行号和列号在函数中是硬编码的。这可以由调用者传递。

因此,函数可以重写并调用为:

selectvalue <- function(dataframe, rownum, colnum){
  get(dataframe)[rownum,colnum]

}

selectvalue(paste0("dataframenumber",4), 1 ,4)
#[1] "12"
selectvalue(paste0("dataframenumber",4), 2 ,2)
#[1] "05/12/2012 06:00"

【讨论】:

  • 这是正确的,谢谢!但我认为我的代码有令人困惑的变量,所以我实际上想要做的是: get(paste0(dataframe,number))[1,4] selectvalue("dataframe","number4") 其中 [1,4 ] 在函数中指定;我正在“获取”数据框名称,而不是位置。那有意义吗?无论如何,这是正确的答案。感谢您的帮助!
  • @DrHeadland 我已经给出了一些关于重写你的函数的更多想法。基本点是关于使用get,您可以根据需要添加业务逻辑。
  • 这很好,感谢您的建议。我硬编码了 [1,4] 只是因为它是我可以重现错误的最小代码。
猜你喜欢
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 2013-11-06
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多