【问题标题】:Using noquotes function within dplyer runs forever在 dplyer 中使用 noquotes 函数永远运行
【发布时间】:2020-10-05 11:16:53
【问题描述】:

您好,我正在开发一个闪亮的应用程序,我想根据输入变量安排我的 df。由于 dplyr 要求不带引号的列名,我尝试使用 noquote 函数,但由于某种原因,控制台永远运行。这是一个最小的例子:

    Server <- function(Input, Output) {
        # loading data sets and bring them to Long Format
        long_data <- read.csv("path")

        x <- paste("This_is_variable", Input$arrange, sep="")
        z <- noquote(x)
        long_data <- long_data %>% arrange(z)
        }

我无法弄清楚问题是什么。如果我使用print(z) 它返回不带引号所需的变量,但在排列命令中 dplyr 似乎有问题。如果我将不带引号的变量输入到排列中,它就可以正常工作。

【问题讨论】:

标签: r dplyr shiny


【解决方案1】:

这里有几个问题。

首先,您在闪亮中依赖用户输入所做的任何事情都需要包装在reactive()observe()(更常见的是前者)中。在这里你没有这样做。

第二个是尝试arrange() 字符串“This_is_variablesomething”上的数据框是没有意义的。相反,您希望输入用户选择的变量。

最后是你不要使用noquote()来使用dplyr进行编程。如果您未在引号中提供变量,则使用隧道 {{ }} 提供变量,如果在引号中提供变量,则使用 .data[[x]]。在这种情况下,您将使用后一个示例,使用 .data[[input$arrange]]

这里尝试解决所有 3 个问题。但是,这可能对您不起作用,因为您的示例不可重现。

# Note that you shouldn't put this in the server code, otherwise you will continually reload the data every time the user does something.
    long_data <- read.csv("path")

Server <- function(Input, Output) {

   arranged_df <- reactive({
    arrange(long_data, .data[[input$arrange]])
    # Could also be arrange(long_data, across(input$arrange))
  })

 }

【讨论】:

  • base::noquote() 不起作用的原因是它为字符串分配了“noquote”类属性,这会影响它打印到控制台的方式。它不会将字符串更改为表达式,这是大多数 dplyr 动词所期望的。 {{!! 来自 rlang 包。您可以使用 dplyr::across() 直接为动词提供字符串,而无需额外的依赖,例如arrange(long_data, across(input$arrange))
  • 感谢@bcarlsen,添加across() 作为另一种选择。
【解决方案2】:

您需要使用取消引用 rlang 的方式,即:

df<-data.frame(lapply(1:7, function(x) rnorm(100) ))
names(df) <- paste0("This_is_variable", 1:7)
x <-  paste0("This_is_variable", 1) # 1 is the userinput
df %>% arrange(!!x)

【讨论】:

    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 2018-11-13
    • 2011-01-20
    • 2018-04-17
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多