【问题标题】:creating a variable with an existing function [i.e., max()] within a user defined R function在用户定义的 R 函数中使用现有函数 [即 max()] 创建变量
【发布时间】: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'

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

提前致谢!

肖恩

【问题讨论】:

    标签: r function


    【解决方案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) 返回什么?
      猜你喜欢
      • 2012-06-19
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2015-05-17
      • 2017-01-20
      • 1970-01-01
      • 2010-09-15
      • 2014-04-20
      相关资源
      最近更新 更多