你好,我是IDG的Sharon Machlis,这里有一个额外的奖励,做更多的R视频:创建一个互动闪亮的网页应用程序来跟踪推文通过一个标签。
主要内容展示了如何搜索tweet、将它们导入到R中以及创建一个可排序、可过滤的表。本视频进一步介绍了这段代码,并添加了额外的搜索和过滤功能。让我们开始吧!
在RStudio中,这里是主要章节的代码。如果你想了解这些,请浏览YouTube或InfoWorld上的第41集。
现在让我们把它变成一个本地交互式闪亮的应用程序,甚至更多的过滤可能性。
首先,我将在RStudio的新子目录中创建一个新的shiny应用程序,方法是使用文件>新文件> new shiny Web Application。我会叫我的应用TwitterSearch但你可以叫任何名字。您将得到一个默认的app.R文件。
一个闪亮的应用程序的ui部分是用户界面,或者用户——在本例中是您——与之交互的前端HTML页面。服务器部分是后端R代码,它执行所有计算以使用户的请求真正工作。
我通常首先删除默认app.R文件中的大部分注释,更改标题,然后加载我需要的所有包。
接下来,我将添加搜索tweet、将其导入到R并修改一个版本以在表中显示的代码—但是我将对其进行一点美化。
我知道我想要URL html格式的功能,我在主要情节。我将把这个URL函数复制到app.R文件的顶部,在所有交互代码之前。(我也可以把它放在一个单独的帮助文件和源文件。)我的应用程序的顶部现在是这样的:
接下来,我将添加代码来从我的搜索查询创建初始twitter数据框架。放在app.R的服务器部分。由于该数据框架将根据用户的请求而更改和更新,所以我需要将其设置为一个响应值。
到目前为止,用户可以更改两项:hashtag搜索查询和要返回的tweet数量。与在文件顶部硬编码值不同,我希望将这些值添加为用户可以更改的输入。
这意味着在app.R ui部分中添加两个用户输入字段:hashtag_to_search和num_tweets_to_download。我将创建一个文本框来输入hashtag,并创建一个数字输入框或滑动条来输入要请求的tweet的数量。
对于tweet的数量,我将首先保留默认app.R中的滑块。num_tweets_to_download然而,我会改变它的id,用户看到的标签“微博下载数量:”,最小值为100,18000年最大价值,默认值为200,和步骤(添加或减去多少钱每个细微的滑块的移动)100。
我还将删除服务器部分中括号之间的所有东西,因为我改变了输入,默认应用将不再工作。
如果我通过点击RStudio窗格右上方的run app按钮来运行应用程序
我可以看到我的滑块-尽管它还没有做任何事情。
当移动滑块时,如果很难得到你想要的确切值。我将滑动条改为numericInput()框
这给了我一个可以输入的框,而不是滑动条。
接下来,我将使用shiny的textInput()函数为hashtag查询添加一个文本输入框。我将框的inputId设置为hashtag_to_search,标签设置为“Hashtag to search:”,默认值设置为“#rstudioconf”。我的边栏面板代码现在看起来是这样的:
请注意,由于我向侧边栏面板添加了第二个输入参数,所以在第一个输入之后需要一个逗号。在编写漂亮的应用程序时,正确使用括号和逗号可能是一项挑战。一个一个地创建输入和输出,并在每次添加后运行代码,可以帮助更容易地发现问题。
让我运行这个更新后的代码
基本的侧边栏已经完成了,但是我还需要在ui中输入一个信息来告诉shiny我希望我的tweet表显示在哪里。我将把这个占位符放在主面板中。默认应用程序的主面板有plotOutput(“distPlot”),它告诉shiny在页面的主要部分为一个情节保留空间。我想在那里有一个reactable表,所以我将plotOutput()更改为reactableOutput(" tweet_table ")。如果我现在点击运行我的应用,什么都没有改变。但我们快到了。
终于到了实际获取和显示tweet的时候了。与原始代码一样,我将使用rtweet的search_tweet()函数搜索tweet并将结果存储在tweets_df中(它将包含90列)。然后,我将从我的结果创建一个tweets_table_data数据框架,格式化后显示在一个表中;并对表进行编码。所有这些服务器逻辑都必须位于app.R文件的服务器部分中。
我可以通过一些修改重用我的原始代码。最重要的几点:1。任何根据用户输入而变化的变量都需要是反应值,而不是传统的R对象。我必须以与常规变量稍微不同的方式创建和处理它们。但令人高兴的是,这些调整都是微不足道的。2.任何时候,我需要一个用户输入的值,我必须引用它作为输入美元符号变量名,而不仅仅是变量名。
让我们看看它是如何工作的。
要将“常规”值转换为活性值,可以使用shiny的活性({})函数。
我只需要更改tweet_table_data代码的前三行,并在末尾添加右大括号和括号。
第一行创建了一个可以根据用户输入更改的对象。第二行告诉shiny在tweet_df()数据帧存在之前不要开始对tweet_table_data的任何计算。如果不这样做,我的应用程序可能会抛出一个错误,如果它试图运行计算的数据框架不存在。还要注意,它是tweet_df括号,而不是tweet_df,因为该数据帧是反应的。
最后是表代码。它需要三个小的改变:
由于表格是可视化的,shiny需要知道把它放在哪里,它是什么。我将把表存储在一个名为output dollar sign tweet_table的变量中。这将它与用户界面中的reactableOutput(“tweet_table”)占位符连接起来。
我还将使用renderReactable()函数,以便让shiny知道它正在创建什么样的可视化。代码应该要求出现tweet_table_data数据帧,否则应用程序在试图从不存在的数据生成表时可能会抛出错误。
2.代码还需要使用括号引用tweet_table_data,因为它是被动的。
我想改变应用程序的反应,如果我改变默认的标签或数量的推文请求。默认情况下,shiny会尝试在我输入时更新数据。很多时候,这是很酷很有用的行为。但这不是其中之一。我不希望每次我输入一个字母或数字时,应用程序都会调用Twitter API !如果我有一个很长的标签,我就会冒着碰到API限制的风险。
我不希望我的应用程序向Twitter API发出请求,直到我点击了“获取数据”按钮。RStudio为此推荐一个“操作按钮”。与在shiny中的大多数事情一样,这涉及到两个部分:ui和服务器。
对于ui,我可以使用actionButton()函数添加一个动作按钮。
让我把这个添加到UI中:
要使该按钮执行某些操作——或者更准确地说,停止应用程序执行某些操作,直到所有输入信息就绪——我需要将tweet_df()对象从一个响应值更改为响应事件。这意味着它不会根据用户输入的值更改值,而是根据用户采取的操作(比如单击按钮)更改值。
注意输入$my_button_id后的逗号!我已经花了相当多的时间来跟踪一些明显的错误,因为我忘记了活性函数的第一个参数后面有一个逗号。
我需要改变我的服务器代码中的tweet_df定义
如果我现在运行应用程序,什么也不会发生,直到我点击“获取数据”按钮。
我还可以对这个应用程序进行更多的增强,比如按日期范围过滤,添加一个下载数据按钮。我将在与此视频相关的文章中介绍这些内容。
这就是本期节目的全部内容,感谢收看!R技巧,去做更多的与R在bit-dot-ly削减做更多页面,所有的小写字母,除了与R R .您还可以找到更多在YouTube IDG技术讨论频道播放列表,您可以订阅你千万不要错过一集。希望下次再见到你!