在用户定义的 R 函数中使用现有函数 [即 max()] 创建变量

Posted

技术标签:

【中文标题】在用户定义的 R 函数中使用现有函数 [即 max()] 创建变量【英文标题】:creating a variable with an existing function [i.e., max()] within a user defined R function 【发布时间】:2022-01-15 10:47:13 【问题描述】:

如果这是一个重复的问题,我很抱歉,但我找不到任何我能理解的答案。

我正在尝试制作一个简单的用户定义函数(我的第一次尝试),以便更轻松地探索更大的数据集。数据具有这种基本形式。

ID <- c("A","A","A","A","A","B","B","B","B","B")
x <- seq(1:10)
y <- sample(1:100, 10)
z <- sample(1:100, 10)
data <- data.frame(x,y,z)

这是一个有效的简单功能,但只是部分有效。简而言之,我希望能够在函数中指定 ID,并为与该 ID 关联的数据制作一个 2 变量散点图:

summary_plot("A")

summary_plot <- function(ID_code) 
plot(data$x[data$ID==ID_code],data$y[data$ID==ID_code], xlim=c(0,10))
points(data$x[data$ID==ID_code],data$z[data$ID==ID_code], col="red")

如您所见,我首先绘制变量 y,然后添加变量 z 的点。问题是,有时 y 轴上变量 y 的数据范围超出了第一个图的范围(对于 x 来说不是问题,因为它有固定的范围)。

我的粗略解决方案是使用 max() 函数找到两个值的最大值,并将第一个图的 ylim 设置为该值,m。

summary_plot <- function(ID_code) 

max_y <- max(data$y[data$ID==ID_code]) ## max of y
max_z <- max(data$z[data$ID==ID_code]) ## max of z
maximum <- c(as.numeric(max_y),as.numeric(max_z)) # both in a vector
m <- (as.numeric(max(maximum))) #find the higher max

plot(data$x[data$ID==ID_code],data$y[data$ID==ID_code], xlim=c(0,10))
points(data$x[data$ID==ID_code],data$z[data$ID==ID_code], col="red", ylim=c(0,m)

所有这些代码在控制台中都可以正常工作,但在我执行该函数时什么也不做。该图已创建,但未指定 y 值。当我检查时,m 的值我得到 'Error: object 'm' not found'

如果有人能解释为什么这不起作用的基本原理,并提出解决方法,我将不胜感激。

提前致谢!

肖恩

【问题讨论】:

【参考方案1】:

我认为您的代码中只是有一些拼写错误,而您的代码逻辑基本上没有错。看起来您忘记关闭函数中点的括号,并且忘记在数据框中包含 ID 变量。这是修改后的代码。看看这是不是你想要的:

set.seed(45)

ID <- c("A","A","A","A","A","B","B","B","B","B")
x <- seq(1:10)
y <- sample(1:100, 10)
z <- sample(1:100, 10)
data <- data.frame(x,y,z,ID)

summary_plot<-function(ID_code)
  max_y <- max(data$y[data$ID==ID_code]) ## max of y
  max_z <- max(data$z[data$ID==ID_code]) ## max of z
  maximum <- c(as.numeric(max_y),as.numeric(max_z)) # both in a vector
  m <- as.numeric(max(maximum)) #find the higher max
  print(m)
  plot(data$x[data$ID==ID_code],data$y[data$ID==ID_code], xlim=c(0,10))
  points(data$x[data$ID==ID_code],data$z[data$ID==ID_code], col="red", ylim=c(0,m))

  
summary_plot("A")

看起来像这样

【讨论】:

【参考方案2】:

这是一个更简单的函数版本。在ID_code 上设置一个子集,只需在开头一次就可以让一切变得更简单、更易读。 并且在绘图打开时设置 ylim 将使 y 轴以给定值开始和结束,设置它们之后没有效果。

summary_plot<-function(ID_code)
  d <- data[data$ID == ID_code, ]
  max_y <- max(d$y)           # max of y
  max_z <- max(d$z)           # max of z
  maximum <- c(max_y, max_z)  # both in a vector
  m <- max(maximum)           # find the higher max
  plot(d$x, d$y, xlim = c(0, 10), ylim = c(0, m))
  points(d$x, d$z, col = "red")
  m                           # return m


summary_plot("A")

【讨论】:

谢谢!问题是当我运行这段代码时,它不起作用。我得到: plot.window(...) 中的错误:需要有限的 'ylim' 值此外:警告消息:1:在 max(d$y) 中:max 没有非缺失参数;返回 -Inf 2:在 max(d$z) 中:max 没有非缺失参数;返回 -Inf 错误:找不到对象'm' 我喜欢对数据进行子集化的想法,最初尝试了这个,但也无法让它工作。下面的示例@Sean McKenzie 有效。 @seanstankowski 我用你的数据试过了,它有效,这就是我发布答案的原因。该图是使用该功能生成的。你确定你的数据是数字的吗? str(data) 返回什么?

以上是关于在用户定义的 R 函数中使用现有函数 [即 max()] 创建变量的主要内容,如果未能解决你的问题,请参考以下文章

SQL CLR 用户定义函数 (C#) 在返回的字符串中的每个现有字符之间添加空字符 (\0)

Python 参数与变量

在 R 用户定义函数中传递数据参数

R:在用户定义的函数中使用 get 和 data.table

在SQL中可以使用MAX函数取两个数中较大的一个数吗? 在线等啊

使用定义的函数时,轮廓图在 R 中失败