在用户定义的 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)
R:在用户定义的函数中使用 get 和 data.table