【问题标题】:Why ifelse with character statement is not working?为什么带有字符语句的 ifelse 不起作用?
【发布时间】:2021-07-27 05:41:25
【问题描述】:

我今天在理解函数的工作原理方面遇到了问题。

这是我的代码:

my_fun<- function(x){
        ifelse(as.character(x) == 'Species',
              a<- iris %>% select(x),
              a<- iris*2)
        
        a
}

my_fun(x = Species)

为什么它不起作用?

【问题讨论】:

  • 不要在ifelse 内做作业。这看起来你真的只需要ifelseififelse 在结构和根本上非常不同,它们通常不能正确互换。
  • @r2evens 谢谢!我会在这里试试!

标签: r if-statement dplyr


【解决方案1】:

如果您仍然想ifelse,这里有一个基于@akrun@pietrodito 答案的变体

my_fun <- function(x) {
  x <- deparse(substitute(x))
  ifelse(x == "Species",
    a <- list(iris %>% select(x)),
    a <- list(iris * 2)
  )
  a[[1]]
}

给了

> my_fun(Species)
       Species
1       setosa
2       setosa
3       setosa
4       setosa
5       setosa
6       setosa
7       setosa
8       setosa
9       setosa
10      setosa
11      setosa
12      setosa
13      setosa
14      setosa
15      setosa
16      setosa
17      setosa
18      setosa
19      setosa
20      setosa
21      setosa
22      setosa
23      setosa
24      setosa
25      setosa
26      setosa
27      setosa
28      setosa
29      setosa
30      setosa
31      setosa
32      setosa
33      setosa
34      setosa
35      setosa
36      setosa
37      setosa
38      setosa
39      setosa
40      setosa
41      setosa
42      setosa
43      setosa
44      setosa
45      setosa
46      setosa
47      setosa
48      setosa
49      setosa
50      setosa
51  versicolor
52  versicolor
53  versicolor
54  versicolor
55  versicolor
56  versicolor
57  versicolor
58  versicolor
59  versicolor
60  versicolor
61  versicolor
62  versicolor
63  versicolor
64  versicolor
65  versicolor
66  versicolor
67  versicolor
68  versicolor
69  versicolor
70  versicolor
71  versicolor
72  versicolor
73  versicolor
74  versicolor
75  versicolor
76  versicolor
77  versicolor
78  versicolor
79  versicolor
80  versicolor
81  versicolor
82  versicolor
83  versicolor
84  versicolor
85  versicolor
86  versicolor
87  versicolor
88  versicolor
89  versicolor
90  versicolor
91  versicolor
92  versicolor
93  versicolor
94  versicolor
95  versicolor
96  versicolor
97  versicolor
98  versicolor
99  versicolor
100 versicolor
101  virginica
102  virginica
103  virginica
104  virginica
105  virginica
106  virginica
107  virginica
108  virginica
109  virginica
110  virginica
111  virginica
112  virginica
113  virginica
114  virginica
115  virginica
116  virginica
117  virginica
118  virginica
119  virginica
120  virginica
121  virginica
122  virginica
123  virginica
124  virginica
125  virginica
126  virginica
127  virginica
128  virginica
129  virginica
130  virginica
131  virginica
132  virginica
133  virginica
134  virginica
135  virginica
136  virginica
137  virginica
138  virginica
139  virginica
140  virginica
141  virginica
142  virginica
143  virginica
144  virginica
145  virginica
146  virginica
147  virginica
148  virginica
149  virginica
150  virginica

【讨论】:

    【解决方案2】:

    要进行三个更改,

    1. 转换为character 将使用deparse/substitute

    2. if/else 是合适的,因为ifelse 要求所有参数的长度相同

    3. iris * 2 作为 else 选项不起作用,因为数据集也包含 factor 列。所以,我们只需要乘以那些数字列

      my_fun <- function(x) {               
               x <- deparse(substitute(x))
               if(x == 'Species') {
                   iris %>% 
                     select(all_of(x)) 
                 } else {
                      iris  %>%
                       mutate(across(where(is.numeric), ~ .* 2))
               }
        }
      

    -测试

    my_fun(Species)
    #       Species
    #1       setosa
    #2       setosa
    #3       setosa
    #4       setosa
    #5       setosa
    #6       setosa
    #...
         
    

    如果我们传递另一个输入

    my_fun(hello)
    #    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    #1           10.2         7.0          2.8         0.4     setosa
    #2            9.8         6.0          2.8         0.4     setosa
    #3            9.4         6.4          2.6         0.4     setosa
    #4            9.2         6.2          3.0         0.4     setosa
    #5           10.0         7.2          2.8         0.4     setosa
    #6           10.8         7.8          3.4         0.8     setosa
    # ...
    

    【讨论】:

      【解决方案3】:
      library(tidyverse)
      my_fun <- function(x) {
        if(x == "Species") {
          iris %>% select(x)
        } else {
           iris * 2
        }
      }
      
      my_fun("Species")
      

      为什么?

      您有一个错误,因为 Species 在评估时未找到,因为它不是定义的变量。

      可以将非标准评估 (NSE) 功能与 deparsesubstitute 一起使用,请参阅 @akrun 答案。但也许你想用character 来调用你的函数,比如my_fun("Species")

      另一个错误是ifelseif/else 的矢量化版本,在这里您只想测试一个值 (x)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-13
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 2014-01-17
        • 1970-01-01
        相关资源
        最近更新 更多