1. ホーム
  2. r

[解決済み] 型 'closure' を型 'character' のベクトルに強制することはできません。

2022-01-30 23:21:22

質問

shinyを使用してインタラクティブな散布図を作成しようとしています。 虹彩のデータを使って、散布図 *petal vs sepalのxとyの次元をユーザーが選択し、選択した次元の単純な散布図を出力したいのですが、可能でしょうか? かなり簡単です。

まず、次元を表す文字列をggplotに渡すための関数を作る必要がありました。 私はこれを行い、静的なデータでテストしました。 うまくいった。

次に、花弁と萼の寸法(これらは私のX軸とY軸です)に対して、2つのドロップダウンとそれに続く2つの文字列(shinyを使用)を定義します。

次に、shinyのreactive()関数を使って、switch文を使って2つの文字列変数を設定しました。

ここがうまくいかないようです。

出るエラーは Error: cannot coerce type 'closure' to vector of type 'character'

私は、自分のコードをデバッグするために、いくつかのステップを踏みました。 まず、私のコードの最終行にハードコードされた寸法 (例えば "Petal.Length") を差し込みました output$myplot = renderPlot({myplotfunct( ...)

これは素晴らしい動作です。 プロットは私が期待したとおりに描画されます。

それから、この plot 関数に渡している文字列の値を追跡するためのデバッグ行を追加しました。 ビンゴです。 空っぽです。 なぜ ?? UI.rファイルから値が渡される必要があるように思えます。

コードは以下の通りです。

何かお手伝いいただけると幸いです。 ありがとうございます。

UI.R

library(shiny)

# Define UI for dataset viewer application
shinyUI(fluidPage(

# Application title
titlePanel("Shiny Text"),

# Sidebar with controls to select a dataset and specify the
# number of observations to view
sidebarLayout(
  sidebarPanel(
    selectInput("dataset1", "Choose a Sepal Measure:", 
              choices = c("Sepal Length", "Sepal Width")),

    selectInput("dataset2", "Choose a Petal Measure:", 
              choices = c("Petal Length", "Petal Width"))
 ),

 # Main Scatter Plot
 mainPanel(

   textOutput("testvar"),

   plotOutput("myplot")
   )
  )
))

サーバー.R

library(shiny)
library(datasets)

library(ggplot2)

#Define a function to plot passed string variables in ggplot

myplotfunct = function(df, x_string, y_string) {
  ggplot(df, aes_string(x = x_string, y = y_string)) + geom_point()
}

shinyServer(function(input, output) {

# Sepal Inputs
datasetInput1 <- reactive({
  switch(input$dataset1,
       "Sepal Length" = "Sepal.Length",
       "Sepal Width" = "Sepal.Width")
})

# Petal Inputs
datasetInput2 <- reactive({
  switch(input$dataset2,
       "Petal Length" = "Petal.Length",
       "Petal Width" = "Petal.Width")
})

#Debug print value of sting being passed
output$testvar = renderText(print(datasetInput1))

# Plot
output$myplot = renderPlot({myplotfunct(iris, datasetInput1, datasetInput2)})

})

解決方法は?

最後の2行のdatasetInput1、datasetInput2の呼び出しがエラーの原因です。

代わりに datasetInput1() と datasetInput2() を呼び出す必要があります。 そうしないと、R は関数を char に変換しようとします。そうであるべきです。

#Debug print value of sting being passed
output$testvar = renderText(print(datasetInput1()))

# Plot
output$myplot = renderPlot({myplotfunct(iris, datasetInput1(), datasetInput2())})

() を使用すると、リアクティブ要素自体と対話するのではなく、リアクティブ要素の値を取得することができます。これはShinyのかなり基本的なコンセプトで、もしまだ馴染みがないのであれば、おそらく シャイニーチュートリアル

()を追加するだけで、以下のようにエラーが消えます。