【问题标题】:R programming function without ()不带 () 的 R 编程函数
【发布时间】:2011-12-29 03:36:40
【问题描述】:

所以,我有以下非常简单的 map.r 文件。

我正在尝试让用户在交互模式下键入“点击”,然后使用该功能。

由于它是一个函数,用户必须键入“click()”,我怎样才能使它只需要单词(不带括号),然后让该函数对 img 执行某些操作。

所以用户输入:

mydist("image.pnm")

点击

//然后函数click做它应该做的事情

mydist <- function(mapfile) {

    img <- read.pnm(mapfile)

    plot(img)
}

click <- function() {

    //Prompt user to click on img
}

【问题讨论】:

  • 更多细节会有所帮助。你想做什么?为什么不把click() 放在mydist 函数中呢?至少有一种方法可以满足您的要求,但用例似乎很奇怪,至少到目前为止描述的方式是这样。更多详细信息将有助于根据您的情况提供量身定制的答案。
  • 在下面的评论中,@MarkKennedy 写道:我想要一个命令列表类型的功能,在这里。 click 会像 readline() 一样被读入,然后 .r 会做一些事情。等等等等

标签: r function interactive


【解决方案1】:

如果你给它一个自己的类和一个与该信息相呼应的打印方法,你就可以实现你的目标。

  print.click <- function(x, ...){
    #
    # could do something here
    # the <something> could be a plot or calculation
    plot(1:10, 10:1, type="l")
   cat("Your click message here\n perhaps \n Downward line plotted!")
     invisible(x)
 }
 click <- "click"
 class(click) <- "click"


 click
# Your click message here
# perhaps 
# Downward line plotted!

即使您想像 Aaron 演示的那样将类定义“封装”在对象本身中,也不会局限于打印消息。你可以这样做:

print.click <- function(x, ...) {plot(1:10, 10:1, type="l")
   cat("prompt user to click on img...\n")

如果你想打电话给locator,你可以扩展与用户的交互。

【讨论】:

    【解决方案2】:

    这是“正确”的做法。这是我的 .Rprofile 文件中的一个示例。

    invisible(makeActiveBinding("newq", function(...){quartz();par(cex=.75); cat("OK\n")}, .GlobalEnv))  
    

    函数makeActiveBinding 具有某种魔力,因此无需任何括号即可调用完整的函数。

    【讨论】:

    • 这是更紧凑的方法。
    【解决方案3】:

    这是执行您所要求的一种方法。但是,可能有更好的方法来做您想做的事情。

    click <- structure(1, class="click")
    print.click <- function(x, ...) {
      cat("prompt user to click on img...\n")
    }
    

    然后

    > click
    prompt user to click on img...
    

    【讨论】:

    • 我想要一个命令列表类型的功能,在这里。 click 会像 readline() 一样被读入,然后 .r 做一些事情。等等等等
    • Aaron 的方法比我的要紧凑一些(如果它们在同一个会话中会覆盖我的),但它们都允许您将任何一组绘图或其他命令附加到执行代码。
    • 谢谢,@DWin。不过,你的评论更好。随意将这种定义 click 的方式添加到您的;如果你想这样做,我可能会删除这个答案;这已经是多余的了。
    • 感谢您的许可,但我已经非常喜欢它了。我也会投票。
    • @DWin,我的意思是structure 行;否则它们是一样的,是吗?我实际上不知道您所说的“将类定义封装在对象中”是什么意思。
    【解决方案4】:

    我可能完全不知道您想做什么,但我认为下面的内容可能会回答您的问题。它可以通过添加其他“else-if”选项和其他自定义函数来扩展,以根据用户键入的任何内容运行。

    customfunction <- function() {
    print(1:10)
    }
    
    mydist <- function(mapfile) {
    
       img <- read.pnm(mapfile)
       plot(img)
    
    ANSWER <- readline("")
    
    # customfunction() will be run (printing 1:10) as soon as 
    # the user types "click" and hits enter
    
    if (ANSWER=="click") customfunction()
    
    }
    

    【讨论】:

    • +1 根据 OP 所说,这听起来像是我会做的;甚至可以打印一个小菜单供用户选择他们想做的事情。
    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2011-11-01
    • 2020-11-12
    • 2014-06-12
    相关资源
    最近更新 更多