【问题标题】:R: putting a function and for loop together to create a functionR:把一个函数和for循环放在一起创建一个函数
【发布时间】:2012-08-23 04:48:36
【问题描述】:

我正在尝试反转和反转以查看数字是否在数字颠倒时它们是否相同

我走到这一步,我很困惑......

revdigits = 
function(n) {
    sapply(lapply(strsplit(as.character(n),""),rev),paste,collapse="")  
}
    for(i in 1:length(n)){
        n[i]=
        if(n[i]==0) 0
        else if(n[i] == 1) 1
        else if(n[i] == 6) 9
        else if(n[i] == 8) 8
        else if(n[i] == 9) 6
        else -1 
    }

invertible=
function(n)

n[1] == revdigits(n[1])

有没有办法把它们放在一起(或将它们联系起来)来生产

invertible(c(99, 123, 1691))

[1] FALSE FALSE TRUE

这个结果??

【问题讨论】:

    标签: r function for-loop reverse


    【解决方案1】:

    您已经在代码中使用apply,所以我可能误解了这个问题,但我想答案是

    > invertible = function(n) sapply(n, function(x) x == revdigits(x))
    > invertible(c(99, 123, 1691))
    [1]  TRUE FALSE FALSE
    

    这提醒我们revdigits 工作不正常。很难说出您打算做什么,因为您的代码原样不包含函数中的 for 循环并且存在语法错误:

    > revdigits = 
    + function(n) {
    +     sapply(lapply(strsplit(as.character(n),""),rev),paste,collapse="")
    + }
    > 
    > 
    >     for(i in 1:length(n)){
    +         n[i]=
    +         if(n[i]==0) 0
    +         else if(n[i] == 1) 1
    +         else if(n[i] == 6) 9
    +         else if(n[i] == 8) 8
    +         else if(n[i] == 9) 6
    +         else -1 
    +         }
    Error: object 'n' not found
    > }
    Error: unexpected '}' in "}"
    

    revdigits as is 只是简单地颠倒数字顺序并将数字转换为字符串:

    > revdigits(c(123,69))
    [1] "321" "96" 
    

    要了解它是如何做到的,让我们看一下sapply,看起来好像不是你自己写的,用一个简单的例子从里到外分析:

    > n <- 69
    > as.character(n)
    [1] "69"
    > strsplit(as.character(n),"")
    [[1]]
    [1] "6" "9"    
    > lapply(strsplit(as.character(n),""),rev)
    [[1]]
    [1] "9" "6"
    > sapply(lapply(strsplit(as.character(n),""),rev),paste,collapse="")
    [1] "96"
    

    因此,您的循环看起来应该在最后一步之前应用于数字向量。 将你的循环打包成一个函数:

    rotate = function(n) { 
        for(i in 1:length(n)){
          n[i]=
            if(n[i]==0) 0
          else if(n[i] == 1) 1
          else if(n[i] == 6) 9
          else if(n[i] == 8) 8
          else if(n[i] == 9) 6
          else -1 
        }
      n
    }
    

    测试:

    > rotate(0:9)
     [1]  0  1 -1 -1 -1 -1  9 -1  8  6
    

    并在revdigits申请

    revdigits = function(n) {
        sapply(lapply(lapply(strsplit(as.character(n),""),rev),rotate),paste,collapse="") 
    }
    

    我们得到了一些似乎有效的东西:

    > revdigits(69)
    [1] "69"
    > revdigits(99)
    [1] "66"
    

    更好的是,它已经适用于向量!

    > n <- c(99, 123, 1691)
    > revdigits(n)
    [1] "66"    "-1-11" "1691" 
    > invertible <- function(n) n == revdigits(n)
    > invertible(n)
    [1] FALSE FALSE  TRUE
    

    根本不需要使用索引。

    【讨论】:

    • 我想要做的是检查n在倒置时是否不变。所以例如.. 1691 倒置时将是 1691.. 这就是我需要 TRUE 的原因。 99 会是假的,因为颠倒的 99 会是 66...这清楚吗???...
    • 这对我来说很清楚,但您的问题是关于将循环与函数放在一起。你的反码是错误的,是的。
    • 有些地方有问题,我会尝试修改我的答案。看起来有点像你不完全确定你自己在那里做什么......
    • 嗯,那是因为那部分是正确的....这对我来说太复杂了..作为初学者..很少的事情吧...
    • 天啊。可以相信你所做的。太好了……我觉得很愚蠢……非常感谢您这样做!现在我有点明白了.. 非常感谢 :))))) 非常有帮助!
    【解决方案2】:

    我的尝试:

        invertible <- function(n){
          nd <- unlist(strsplit(as.character(n),split=""))
            if (all(nd %in% c("0","1","6","9","8"))){
              n == as.integer(paste(rev(sapply(nd, function(x){
                                                ifelse(!x %in% c("9","6"),x,
                                                        ifelse(x == "9","6","9"))
                                            })), collapse=""))
            } else {
              FALSE
          }
       }
    
    sum(sapply(1:1e6, invertible))
    # 198
    

    编辑:你可以把 sapply() 放在里面:

    invertible <- function(N){
      sapply(N, function(n){
                nd <- unlist(strsplit(as.character(n),split=""))
                if (all(nd %in% c("0","1","6","9","8"))){
                    n == as.integer(paste(rev(sapply(nd, function(x){
                                                        ifelse(!x %in% c("9","6"),x,
                                                                ifelse(x == "9","6","9"))
                                                    })), collapse=""))
                } else {
                    FALSE
                }                
            })
    
    }
    

    【讨论】:

    • 有没有办法可以打印“invertible(c(123, 1961, 96))”多个 'n's 以获得多个答案?这似乎一次有效..
    猜你喜欢
    • 2022-08-24
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2021-01-18
    • 2021-12-08
    相关资源
    最近更新 更多